合并
This commit is contained in:
commit
72b44632cd
@ -1,6 +1,9 @@
|
|||||||
using Microsoft.CodeAnalysis;
|
using JiShe.CollectBus.Analyzers.Shared;
|
||||||
|
using Microsoft.CodeAnalysis;
|
||||||
using Microsoft.CodeAnalysis.CSharp.Syntax;
|
using Microsoft.CodeAnalysis.CSharp.Syntax;
|
||||||
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Collections.Immutable;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
@ -8,7 +11,7 @@ using System.Text;
|
|||||||
namespace JiShe.CollectBus.IncrementalGenerator
|
namespace JiShe.CollectBus.IncrementalGenerator
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 复杂类型源生成器
|
/// 复杂类型增量源生成器
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[Generator(LanguageNames.CSharp)]
|
[Generator(LanguageNames.CSharp)]
|
||||||
public class ComplexTypeSourceAnalyzers : IIncrementalGenerator
|
public class ComplexTypeSourceAnalyzers : IIncrementalGenerator
|
||||||
@ -19,12 +22,7 @@ namespace JiShe.CollectBus.IncrementalGenerator
|
|||||||
{
|
{
|
||||||
//Debugger.Launch();
|
//Debugger.Launch();
|
||||||
|
|
||||||
context.RegisterPostInitializationOutput(ctx =>
|
// 步骤1:筛选带有 [SourceAnalyzers] 的类
|
||||||
{
|
|
||||||
ctx.AddSource("GeneratorInit.g.cs", "// Initialization Marker");
|
|
||||||
});
|
|
||||||
|
|
||||||
// 步骤1:筛选带有 [GenerateAccessors] 的类
|
|
||||||
var classDeclarations = context.SyntaxProvider
|
var classDeclarations = context.SyntaxProvider
|
||||||
.CreateSyntaxProvider(
|
.CreateSyntaxProvider(
|
||||||
predicate: static (s, _) => IsClassWithAttribute(s),
|
predicate: static (s, _) => IsClassWithAttribute(s),
|
||||||
@ -40,24 +38,42 @@ namespace JiShe.CollectBus.IncrementalGenerator
|
|||||||
|
|
||||||
private static bool IsClassWithAttribute(SyntaxNode node) => node is ClassDeclarationSyntax cds && cds.AttributeLists.Count > 0;
|
private static bool IsClassWithAttribute(SyntaxNode node) => node is ClassDeclarationSyntax cds && cds.AttributeLists.Count > 0;
|
||||||
|
|
||||||
|
|
||||||
private static ClassDeclarationSyntax GetClassDeclaration(GeneratorSyntaxContext context)
|
private static ClassDeclarationSyntax GetClassDeclaration(GeneratorSyntaxContext context)
|
||||||
{
|
{
|
||||||
var classDecl = (ClassDeclarationSyntax)context.Node;
|
var classDecl = (ClassDeclarationSyntax)context.Node;
|
||||||
var attributeType = context.SemanticModel.Compilation.GetTypeByMetadataName(AttributeFullName);
|
var semanticModel = context.SemanticModel;
|
||||||
|
|
||||||
foreach (var attribute in classDecl.AttributeLists.SelectMany(al => al.Attributes))
|
// 获取类符号
|
||||||
|
var classSymbol = semanticModel.GetDeclaredSymbol(classDecl) as INamedTypeSymbol;
|
||||||
|
if (classSymbol == null) return null;
|
||||||
|
|
||||||
|
// 检查是否包含 SourceAnalyzers 特性
|
||||||
|
var sourceAnalyzerAttr = classSymbol.GetAttributes().FirstOrDefault(attr => attr.AttributeClass?.ToDisplayString() == AttributeFullName);
|
||||||
|
|
||||||
|
// 必须包含 EntityType 参数
|
||||||
|
if (sourceAnalyzerAttr == null ||
|
||||||
|
sourceAnalyzerAttr.ConstructorArguments.Length == 0)
|
||||||
{
|
{
|
||||||
var symbol = context.SemanticModel.GetSymbolInfo(attribute).Symbol;
|
|
||||||
if (symbol is IMethodSymbol ctor &&
|
|
||||||
SymbolEqualityComparer.Default.Equals(ctor.ContainingType, attributeType))
|
|
||||||
{
|
|
||||||
return classDecl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return classDecl;
|
||||||
|
|
||||||
|
//var classDecl = (ClassDeclarationSyntax)context.Node;
|
||||||
|
//var attributeType = context.SemanticModel.Compilation.GetTypeByMetadataName(AttributeFullName);
|
||||||
|
|
||||||
|
//foreach (var attribute in classDecl.AttributeLists.SelectMany(al => al.Attributes))
|
||||||
|
//{
|
||||||
|
// var symbol = context.SemanticModel.GetSymbolInfo(attribute).Symbol;
|
||||||
|
// if (symbol is IMethodSymbol ctor &&
|
||||||
|
// SymbolEqualityComparer.Default.Equals(ctor.ContainingType, attributeType))
|
||||||
|
// {
|
||||||
|
// return classDecl;
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
//return null;
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 递归获取所有层级的属性
|
/// 递归获取所有层级的属性
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -76,6 +92,12 @@ namespace JiShe.CollectBus.IncrementalGenerator
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 生成代码
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="compilation"></param>
|
||||||
|
/// <param name="classes"></param>
|
||||||
|
/// <param name="context"></param>
|
||||||
private static void GenerateCode(
|
private static void GenerateCode(
|
||||||
Compilation compilation,
|
Compilation compilation,
|
||||||
IEnumerable<ClassDeclarationSyntax> classes,
|
IEnumerable<ClassDeclarationSyntax> classes,
|
||||||
@ -86,8 +108,8 @@ namespace JiShe.CollectBus.IncrementalGenerator
|
|||||||
if (!classes.Any())
|
if (!classes.Any())
|
||||||
{
|
{
|
||||||
context.ReportDiagnostic(Diagnostic.Create(
|
context.ReportDiagnostic(Diagnostic.Create(
|
||||||
new DiagnosticDescriptor("GEN002", "No Targets",
|
new DiagnosticDescriptor("GEN002", "没有目标类",
|
||||||
"No classes with [GenerateAccessors] found", "Debug", DiagnosticSeverity.Warning, true),
|
"没有找到SourceAnalyzers标记的类", "Debug", DiagnosticSeverity.Warning, true),
|
||||||
Location.None));
|
Location.None));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -99,77 +121,25 @@ namespace JiShe.CollectBus.IncrementalGenerator
|
|||||||
if (classSymbol == null || !processedTypes.Add(classSymbol))
|
if (classSymbol == null || !processedTypes.Add(classSymbol))
|
||||||
{
|
{
|
||||||
context.ReportDiagnostic(Diagnostic.Create(
|
context.ReportDiagnostic(Diagnostic.Create(
|
||||||
new DiagnosticDescriptor("GEN003", "Invalid Symbol",
|
new DiagnosticDescriptor("GEN003", "无效符号",
|
||||||
$"Class symbol is null for {classDecl.Identifier.Text}", "Error", DiagnosticSeverity.Error, true),
|
$"类名称为{classDecl.Identifier.Text} 符号为空", "Error", DiagnosticSeverity.Error, true),
|
||||||
Location.None));
|
Location.None));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
context.ReportDiagnostic(Diagnostic.Create(
|
var code3 = BuildAccessorsForSourceEntity(classSymbol, compilation, processedTypes);
|
||||||
new DiagnosticDescriptor(
|
context.AddSource($"{classSymbol.Name}Accessor.g.cs", code3);
|
||||||
"PA001",
|
|
||||||
"Generated Accessors",
|
|
||||||
$"Generating accessors for {classSymbol.Name}",
|
|
||||||
"Performance",
|
|
||||||
DiagnosticSeverity.Info,
|
|
||||||
true),
|
|
||||||
Location.None));
|
|
||||||
|
|
||||||
// 新增:输出继承链信息
|
|
||||||
context.ReportDiagnostic(Diagnostic.Create(
|
|
||||||
new DiagnosticDescriptor("HIERARCHY", "Class Hierarchy",
|
|
||||||
$"Processing class: {classSymbol.Name}, BaseType: {classSymbol.BaseType?.Name}",
|
|
||||||
"Debug", DiagnosticSeverity.Info, true),
|
|
||||||
Location.None));
|
|
||||||
|
|
||||||
context.ReportDiagnostic(Diagnostic.Create(
|
|
||||||
new DiagnosticDescriptor("PA002", "Class Found",
|
|
||||||
$"Processing class: {classSymbol.Name}", "Debug", DiagnosticSeverity.Warning, true),
|
|
||||||
Location.None));
|
|
||||||
|
|
||||||
var code = BuildAccessorsForType(classSymbol, compilation, processedTypes);
|
|
||||||
|
|
||||||
System.Diagnostics.Debug.WriteLine($"Generated code for {classSymbol.Name}:\n{code}"); // 调试输出
|
|
||||||
|
|
||||||
context.AddSource($"{classSymbol.Name}Extension.g.cs", code);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static string BuildAccessorsForType(
|
// 生成工厂注册代码
|
||||||
INamedTypeSymbol classSymbol,
|
context.AddSource("SourceEntityAccessorFactory.g.cs", BuildFactoryCode());
|
||||||
Compilation compilation,
|
|
||||||
HashSet<ITypeSymbol> processedTypes)
|
|
||||||
{
|
|
||||||
var code = new StringBuilder();
|
|
||||||
code.AppendLine("#pragma warning disable CS0419 // 禁用警告");
|
|
||||||
code.AppendLine("// Generated code for " + classSymbol.Name);
|
|
||||||
code.AppendLine("// <auto-generated/>");
|
|
||||||
code.AppendLine("#nullable enable");
|
|
||||||
code.AppendLine($"namespace {classSymbol.ContainingNamespace.ToDisplayString()};");
|
|
||||||
code.AppendLine();
|
|
||||||
|
|
||||||
code.AppendLine($"public static class {classSymbol.Name}Extension{GetGenericParams(classSymbol)}");
|
|
||||||
code.AppendLine("{");
|
|
||||||
|
|
||||||
//foreach (var prop in classSymbol.GetMembers().OfType<IPropertySymbol>())
|
|
||||||
//{
|
|
||||||
// if (prop.IsIndexer) continue;
|
|
||||||
|
|
||||||
// GeneratePropertyAccessors(prop, code, compilation, processedTypes);
|
|
||||||
//}
|
|
||||||
|
|
||||||
foreach (var prop in GetAllPropertiesInHierarchy(classSymbol))
|
|
||||||
{
|
|
||||||
if (prop.IsIndexer) continue;
|
|
||||||
GeneratePropertyAccessors(prop, code, compilation, processedTypes);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
code.AppendLine("}");
|
/// <summary>
|
||||||
return code.ToString();
|
/// 获取泛型参数
|
||||||
}
|
/// </summary>
|
||||||
|
/// <param name="symbol"></param>
|
||||||
//private static string GetGenericParams(INamedTypeSymbol symbol)
|
/// <returns></returns>
|
||||||
// => symbol.IsGenericType ? $"<{string.Join(", ", symbol.TypeParameters.Select(t => t.Name))}>" : "";
|
|
||||||
public static string GetGenericParams(INamedTypeSymbol symbol)
|
public static string GetGenericParams(INamedTypeSymbol symbol)
|
||||||
{
|
{
|
||||||
if (!symbol.IsGenericType) return "";
|
if (!symbol.IsGenericType) return "";
|
||||||
@ -177,51 +147,13 @@ namespace JiShe.CollectBus.IncrementalGenerator
|
|||||||
return $"<{string.Join(", ", parameters)}>";
|
return $"<{string.Join(", ", parameters)}>";
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void GeneratePropertyAccessors(
|
|
||||||
IPropertySymbol prop,
|
|
||||||
StringBuilder code,
|
|
||||||
Compilation compilation,
|
|
||||||
HashSet<ITypeSymbol> processedTypes)
|
|
||||||
{
|
|
||||||
// 关键修复点1:安全类型转换
|
|
||||||
if (prop.Type is not ITypeSymbol propType) return;
|
|
||||||
|
|
||||||
code.AppendLine($" // Processing property: {prop.Name}");
|
|
||||||
|
|
||||||
// 处理元组类型
|
|
||||||
if (propType is INamedTypeSymbol { IsTupleType: true } tupleType)
|
|
||||||
{
|
|
||||||
GenerateTupleAccessors(prop, tupleType, code);
|
|
||||||
}
|
|
||||||
else if (propType is INamedTypeSymbol namedType)
|
|
||||||
{
|
|
||||||
GenerateStandardAccessors(prop, namedType, code);
|
|
||||||
ProcessNestedType(namedType, compilation, processedTypes);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void GenerateTupleAccessors(IPropertySymbol prop, INamedTypeSymbol tupleType, StringBuilder code)
|
|
||||||
{
|
|
||||||
var elements = tupleType.TupleElements;
|
|
||||||
var parentType = prop.ContainingType.ToDisplayString();
|
|
||||||
|
|
||||||
for (int i = 0; i < elements.Length; i++)
|
|
||||||
{
|
|
||||||
var element = elements[i];
|
|
||||||
if (element.Type is not ITypeSymbol elementType) continue;
|
|
||||||
|
|
||||||
var elementName = element.CorrespondingTupleField?.Name ?? $"Item{i + 1}";
|
|
||||||
code.AppendLine($" public static {elementType.ToDisplayString()} Get{prop.Name}_{elementName}({parentType} obj) => obj.{prop.Name}.{elementName};");
|
|
||||||
|
|
||||||
if (prop.SetMethod != null)
|
|
||||||
{
|
|
||||||
var assignments = elements.Select((e, idx) =>
|
|
||||||
idx == i ? "value" : $"obj.{prop.Name}.{e.Name}");
|
|
||||||
code.AppendLine($" public static void Set{prop.Name}_{elementName}({parentType} obj, {elementType.ToDisplayString()} value) => obj.{prop.Name} = ({string.Join(", ", assignments)});");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 生成标准属性的访问器
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="prop"></param>
|
||||||
|
/// <param name="propType"></param>
|
||||||
|
/// <param name="code"></param>
|
||||||
private static void GenerateStandardAccessors(IPropertySymbol prop, INamedTypeSymbol propType, StringBuilder code)
|
private static void GenerateStandardAccessors(IPropertySymbol prop, INamedTypeSymbol propType, StringBuilder code)
|
||||||
{
|
{
|
||||||
var parentType = prop.ContainingType.ToDisplayString();
|
var parentType = prop.ContainingType.ToDisplayString();
|
||||||
@ -233,22 +165,525 @@ namespace JiShe.CollectBus.IncrementalGenerator
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void ProcessNestedType(ITypeSymbol typeSymbol, Compilation compilation, HashSet<ITypeSymbol> processedTypes)
|
|
||||||
{
|
|
||||||
if (typeSymbol is not INamedTypeSymbol namedType) return;
|
|
||||||
if (!ShouldProcessNestedType(namedType)) return;
|
|
||||||
if (!processedTypes.Add(namedType)) return;
|
|
||||||
|
|
||||||
var code = BuildAccessorsForType(namedType, compilation, processedTypes);
|
/// <summary>
|
||||||
|
/// 构建实体访问器代码(支持泛型)
|
||||||
|
/// </summary>
|
||||||
|
private static string BuildAccessorsForSourceEntity(
|
||||||
|
INamedTypeSymbol classSymbol,
|
||||||
|
Compilation compilation,
|
||||||
|
HashSet<ITypeSymbol> processedTypes)
|
||||||
|
{
|
||||||
|
// 获取 SourceAnalyzers 特性的 EntityType 参数
|
||||||
|
var sourceAnalyzerAttr = classSymbol.GetAttributes()
|
||||||
|
.FirstOrDefault(attr =>
|
||||||
|
attr.AttributeClass?.ToDisplayString() == AttributeFullName);
|
||||||
|
|
||||||
|
// 解析 EntityType 枚举值
|
||||||
|
string entityTypeValue = "EntityTypeEnum.Other"; // 默认值
|
||||||
|
if (sourceAnalyzerAttr != null &&
|
||||||
|
sourceAnalyzerAttr.ConstructorArguments.Length > 0)
|
||||||
|
{
|
||||||
|
var arg = sourceAnalyzerAttr.ConstructorArguments[0];
|
||||||
|
if (arg.Kind == TypedConstantKind.Enum &&
|
||||||
|
arg.Type is INamedTypeSymbol enumType)
|
||||||
|
{
|
||||||
|
int enumValue = (int)arg.Value!;
|
||||||
|
entityTypeValue = GetEnumMemberName(enumType, enumValue);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static bool ShouldProcessNestedType(INamedTypeSymbol symbol)
|
var code = new StringBuilder();
|
||||||
|
code.AppendLine("// <auto-generated/>");
|
||||||
|
code.AppendLine("#nullable enable");
|
||||||
|
code.AppendLine("using System;");
|
||||||
|
code.AppendLine("using System.Reflection;");
|
||||||
|
code.AppendLine("using System.Collections.Generic;");
|
||||||
|
code.AppendLine("using JiShe.CollectBus.Analyzers.Shared;");
|
||||||
|
code.AppendLine($"namespace {classSymbol.ContainingNamespace.ToDisplayString()};");
|
||||||
|
code.AppendLine();
|
||||||
|
|
||||||
|
// 处理泛型类型名称
|
||||||
|
var accessibility = classSymbol.DeclaredAccessibility switch
|
||||||
{
|
{
|
||||||
return symbol.DeclaredAccessibility == Accessibility.Public &&
|
Accessibility.Public => "public",
|
||||||
!symbol.IsTupleType &&
|
_ => "internal"
|
||||||
!symbol.IsAnonymousType &&
|
};
|
||||||
!symbol.IsImplicitlyDeclared &&
|
|
||||||
!symbol.Name.StartsWith("<");
|
var genericParams = classSymbol.IsGenericType
|
||||||
|
? $"<{string.Join(", ", classSymbol.TypeParameters.Select(t => t.Name))}>"
|
||||||
|
: "";
|
||||||
|
|
||||||
|
code.AppendLine(
|
||||||
|
$"{accessibility} sealed class {classSymbol.Name}Accessor{genericParams} " + // 保留泛型参数
|
||||||
|
$": ISourceEntityAccessor<{classSymbol.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat)}>");
|
||||||
|
|
||||||
|
code.AppendLine("{");
|
||||||
|
|
||||||
|
var propList = GetAllPropertiesInHierarchy(classSymbol);
|
||||||
|
|
||||||
|
//类名称
|
||||||
|
code.AppendLine($" public string EntityName {{get;}} = \"{classSymbol.Name}\";");
|
||||||
|
// 添加 EntityType 属性
|
||||||
|
code.AppendLine($" public EntityTypeEnum? EntityType {{ get; }} = {entityTypeValue};");
|
||||||
|
|
||||||
|
foreach (var prop in propList)
|
||||||
|
{
|
||||||
|
// 安全类型转换
|
||||||
|
if (prop.Type is not ITypeSymbol propType) continue;
|
||||||
|
|
||||||
|
if (propType is INamedTypeSymbol namedType)
|
||||||
|
{
|
||||||
|
GenerateStandardAccessors(prop, namedType, code);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (propType is INamedTypeSymbol { IsTupleType: true } tupleType)
|
||||||
|
{
|
||||||
|
GenerateTupleAccessors(prop, tupleType, code);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//生成当前类属性名称集合
|
||||||
|
GeneratePropertyListForSourceEntity(propList, code, compilation, classSymbol);
|
||||||
|
|
||||||
|
//生成当前类属性信息集合
|
||||||
|
GenerateEntityMemberInfoList(propList, code, compilation, classSymbol);
|
||||||
|
|
||||||
|
|
||||||
|
//生成当前类属性访问
|
||||||
|
GetGeneratePropertyValueForSourceEntity(propList, code, compilation, classSymbol);
|
||||||
|
|
||||||
|
//生成当前类属性设置
|
||||||
|
SetGeneratePropertyValueForSourceEntity(propList, code, compilation, classSymbol);
|
||||||
|
|
||||||
|
code.AppendLine("}");
|
||||||
|
return code.ToString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 生成ValueTuple元组属性访问器
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="prop"></param>
|
||||||
|
/// <param name="tupleType"></param>
|
||||||
|
/// <param name="code"></param>
|
||||||
|
private static void GenerateTupleAccessors(
|
||||||
|
IPropertySymbol prop,
|
||||||
|
INamedTypeSymbol tupleType,
|
||||||
|
StringBuilder code)
|
||||||
|
{
|
||||||
|
var parentType = prop.ContainingType.ToDisplayString();
|
||||||
|
var tupleElements = tupleType.TupleElements;
|
||||||
|
|
||||||
|
for (int i = 0; i < tupleElements.Length; i++)
|
||||||
|
{
|
||||||
|
var element = tupleElements[i];
|
||||||
|
var elementType = element.Type.ToDisplayString();
|
||||||
|
var elementName = element.Name;
|
||||||
|
|
||||||
|
// Getter
|
||||||
|
code.AppendLine($"public static {elementType} Get{prop.Name}_{elementName}({parentType} obj) => obj.{prop.Name}.{elementName};");
|
||||||
|
|
||||||
|
// Setter
|
||||||
|
if (prop.SetMethod != null)
|
||||||
|
{
|
||||||
|
code.AppendLine($"public static void Set{prop.Name}_{elementName}({parentType} obj, {elementType} value) => obj.{prop.Name} = ({string.Join(", ", GetTupleElements(prop.Name, tupleElements, i))});");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static IEnumerable<string> GetTupleElements(
|
||||||
|
string propName,
|
||||||
|
ImmutableArray<IFieldSymbol> elements,
|
||||||
|
int targetIndex)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < elements.Length; i++)
|
||||||
|
{
|
||||||
|
yield return i == targetIndex
|
||||||
|
? "value"
|
||||||
|
: $"obj.{propName}.{elements[i].Name}";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 处理System.Tuple类型的访问器生成
|
||||||
|
/// </summary>
|
||||||
|
private static void GenerateSystemTupleAccessors(
|
||||||
|
IPropertySymbol prop,
|
||||||
|
INamedTypeSymbol tupleType,
|
||||||
|
StringBuilder code,
|
||||||
|
INamedTypeSymbol classSymbol)
|
||||||
|
{
|
||||||
|
var parentType = classSymbol.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat);
|
||||||
|
var elementTypes = tupleType.TypeArguments;
|
||||||
|
var tupleTypeName = tupleType.ToDisplayString();
|
||||||
|
|
||||||
|
for (int i = 0; i < elementTypes.Length; i++)
|
||||||
|
{
|
||||||
|
var elementType = elementTypes[i].ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat);
|
||||||
|
var elementName = $"Item{i + 1}";
|
||||||
|
|
||||||
|
// Getter
|
||||||
|
code.AppendLine(
|
||||||
|
$" public static {elementType} Get{prop.Name}_{elementName}" +
|
||||||
|
$"({parentType} obj) => obj.{prop.Name}.{elementName};");
|
||||||
|
|
||||||
|
// Setter
|
||||||
|
if (prop.SetMethod != null)
|
||||||
|
{
|
||||||
|
var assignments = elementTypes.Select((_, idx) =>
|
||||||
|
idx == i ? "value" : $"obj.{prop.Name}.Item{idx + 1}"
|
||||||
|
).ToList();
|
||||||
|
|
||||||
|
code.AppendLine(
|
||||||
|
$" public static void Set{prop.Name}_{elementName}" +
|
||||||
|
$"({parentType} obj, {elementType} value) => " +
|
||||||
|
$"obj.{prop.Name} = new {tupleTypeName}({string.Join(", ", assignments)});");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 增强的工厂类实现
|
||||||
|
/// </summary>
|
||||||
|
private static string BuildFactoryCode()
|
||||||
|
{
|
||||||
|
return """
|
||||||
|
using System;
|
||||||
|
using System.Collections.Concurrent;
|
||||||
|
using System.Reflection;
|
||||||
|
|
||||||
|
namespace JiShe.CollectBus.Analyzers.Shared;
|
||||||
|
|
||||||
|
public static class SourceEntityAccessorFactory
|
||||||
|
{
|
||||||
|
private static readonly ConcurrentDictionary<Type, object> _accessors = new();
|
||||||
|
|
||||||
|
public static ISourceEntityAccessor<T> GetAccessor<T>()
|
||||||
|
{
|
||||||
|
return (ISourceEntityAccessor<T>)_accessors.GetOrAdd(typeof(T), t =>
|
||||||
|
{
|
||||||
|
// 获取泛型类型定义信息(如果是泛型类型)
|
||||||
|
var isGeneric = t.IsGenericType;
|
||||||
|
var genericTypeDef = isGeneric ? t.GetGenericTypeDefinition() : null;
|
||||||
|
var arity = isGeneric ? genericTypeDef!.GetGenericArguments().Length : 0;
|
||||||
|
|
||||||
|
// 构建访问器类名
|
||||||
|
var typeName = isGeneric
|
||||||
|
? $"{t.Namespace}.{genericTypeDef!.Name.Split('`')[0]}Accessor`{arity}"
|
||||||
|
: $"{t.Namespace}.{t.Name}Accessor";
|
||||||
|
|
||||||
|
// 尝试从当前程序集加载
|
||||||
|
var accessorType = Assembly.GetAssembly(t)!.GetType(typeName)
|
||||||
|
?? throw new InvalidOperationException($"Accessor type {typeName} not found");
|
||||||
|
|
||||||
|
// 处理泛型参数
|
||||||
|
if (isGeneric && accessorType.IsGenericTypeDefinition)
|
||||||
|
{
|
||||||
|
accessorType = accessorType.MakeGenericType(t.GetGenericArguments());
|
||||||
|
}
|
||||||
|
|
||||||
|
return Activator.CreateInstance(accessorType)!;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
""";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 属性访问生成逻辑
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="propList">属性集合</param>
|
||||||
|
/// <param name="code"></param>
|
||||||
|
/// <param name="compilation"></param>
|
||||||
|
/// <param name="classSymbol"></param>
|
||||||
|
private static void GetGeneratePropertyValueForSourceEntity(
|
||||||
|
IEnumerable<IPropertySymbol> propList,
|
||||||
|
StringBuilder code,
|
||||||
|
Compilation compilation,
|
||||||
|
INamedTypeSymbol classSymbol)
|
||||||
|
{
|
||||||
|
code.AppendLine($" public object GetPropertyValue({classSymbol} targetEntity, string propertyName)");
|
||||||
|
code.AppendLine(" {");
|
||||||
|
code.AppendLine(" return propertyName switch");
|
||||||
|
code.AppendLine(" {");
|
||||||
|
|
||||||
|
foreach (var prop in propList)
|
||||||
|
{
|
||||||
|
code.AppendLine(
|
||||||
|
$" \"{prop.Name}\" => " +
|
||||||
|
$"Get{prop.Name}(targetEntity),");
|
||||||
|
|
||||||
|
if (prop.Type is INamedTypeSymbol { IsTupleType: true } tupleType)
|
||||||
|
{
|
||||||
|
foreach (var element in tupleType.TupleElements)
|
||||||
|
{
|
||||||
|
code.AppendLine(
|
||||||
|
$" \"{prop.Name}.{element.Name}\" => " +
|
||||||
|
$"Get{prop.Name}_{element.Name}(targetEntity),");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
code.AppendLine(" _ => throw new ArgumentException($\"Unknown property: {propertyName}\")");
|
||||||
|
code.AppendLine(" };");
|
||||||
|
code.AppendLine(" }");
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 属性设置生成逻辑
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="propList">属性集合</param>
|
||||||
|
/// <param name="code"></param>
|
||||||
|
/// <param name="compilation"></param>
|
||||||
|
/// <param name="classSymbol"></param>
|
||||||
|
private static void SetGeneratePropertyValueForSourceEntity(
|
||||||
|
IEnumerable<IPropertySymbol> propList,
|
||||||
|
StringBuilder code,
|
||||||
|
Compilation compilation,
|
||||||
|
INamedTypeSymbol classSymbol)
|
||||||
|
{
|
||||||
|
code.AppendLine($" public void SetPropertyValue({classSymbol} targetEntity, string propertyName, object value)");
|
||||||
|
code.AppendLine(" {");
|
||||||
|
code.AppendLine(" switch (propertyName)");
|
||||||
|
code.AppendLine(" {");
|
||||||
|
|
||||||
|
foreach (var prop in propList)
|
||||||
|
{
|
||||||
|
var propType = prop.Type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat);
|
||||||
|
code.AppendLine($" case \"{prop.Name}\":");
|
||||||
|
code.AppendLine($" Set{prop.Name}(");
|
||||||
|
code.AppendLine($" targetEntity, ({propType})value);");
|
||||||
|
code.AppendLine(" break;");
|
||||||
|
|
||||||
|
if (prop.Type is INamedTypeSymbol { IsTupleType: true } tupleType)
|
||||||
|
{
|
||||||
|
foreach (var element in tupleType.TupleElements)
|
||||||
|
{
|
||||||
|
var elementType = element.Type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat);
|
||||||
|
code.AppendLine($" case \"{prop.Name}.{element.Name}\":");
|
||||||
|
code.AppendLine($" Set{prop.Name}_{element.Name}(");
|
||||||
|
code.AppendLine($" targetEntity, ({elementType})value);");
|
||||||
|
code.AppendLine(" break;");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
code.AppendLine(" default:");
|
||||||
|
code.AppendLine(" throw new ArgumentException($\"Unknown property: {propertyName}\");");
|
||||||
|
code.AppendLine(" }");
|
||||||
|
code.AppendLine(" }");
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 属性名称集合
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="propList">属性集合</param>
|
||||||
|
/// <param name="code"></param>
|
||||||
|
/// <param name="compilation"></param>
|
||||||
|
/// <param name="classSymbol"></param>
|
||||||
|
private static void GeneratePropertyListForSourceEntity(
|
||||||
|
IEnumerable<IPropertySymbol> propList,
|
||||||
|
StringBuilder code,
|
||||||
|
Compilation compilation,
|
||||||
|
INamedTypeSymbol classSymbol)
|
||||||
|
{
|
||||||
|
code.AppendLine(" public List<string> PropertyNameList {get;} = new List<string>()");
|
||||||
|
code.AppendLine(" {");
|
||||||
|
List<string> tempPropList = new List<string>();
|
||||||
|
foreach (var prop in propList)
|
||||||
|
{
|
||||||
|
if (prop.Type is INamedTypeSymbol { IsTupleType: true } tupleType)
|
||||||
|
{
|
||||||
|
foreach (var element in tupleType.TupleElements)
|
||||||
|
{
|
||||||
|
tempPropList.Add($"\"{prop.Name}.{element.Name}\"");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
tempPropList.Add($"\"{prop.Name}\"");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
code.Append(string.Join(",", tempPropList));
|
||||||
|
|
||||||
|
code.AppendLine(" };");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 生成当前类属性信息集合
|
||||||
|
/// </summary>
|
||||||
|
private static void GenerateEntityMemberInfoList(
|
||||||
|
IEnumerable<IPropertySymbol> propList,
|
||||||
|
StringBuilder code,
|
||||||
|
Compilation compilation,
|
||||||
|
INamedTypeSymbol classSymbol)
|
||||||
|
{
|
||||||
|
code.AppendLine(" public List<EntityMemberInfo> MemberList { get; } = new()");
|
||||||
|
code.AppendLine(" {");
|
||||||
|
|
||||||
|
var initializerLines = new List<string>();
|
||||||
|
|
||||||
|
foreach (var prop in propList)
|
||||||
|
{
|
||||||
|
var entityType = prop.ContainingType.ToDisplayString();//entity 实体类型名称
|
||||||
|
var propType = prop.Type;//实体属性的类型
|
||||||
|
var propTypeName = propType.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat);
|
||||||
|
var declaredTypeName = propType.Name; // 直接获取类型名称(如 "Int32")
|
||||||
|
|
||||||
|
// 处理主属性
|
||||||
|
var propAttributes = prop.GetAttributes()
|
||||||
|
.Where(a => !IsCompilerGeneratedAttribute(a))
|
||||||
|
.ToList();
|
||||||
|
|
||||||
|
var attributeInitializers = propAttributes
|
||||||
|
.Select(GenerateAttributeInitializer)
|
||||||
|
.Where(s => !string.IsNullOrEmpty(s));
|
||||||
|
|
||||||
|
var mainMember = new StringBuilder();
|
||||||
|
mainMember.Append(
|
||||||
|
$"new EntityMemberInfo(" +
|
||||||
|
$"\"{prop.Name}\", " +
|
||||||
|
$"typeof({propTypeName}), " +
|
||||||
|
$"\"{declaredTypeName}\", " +
|
||||||
|
$"(e) => Get{prop.Name}(({entityType})e), " +
|
||||||
|
$"(e, v) => Set{prop.Name}(({entityType})e, ({propTypeName})v))");
|
||||||
|
|
||||||
|
if (attributeInitializers.Any())
|
||||||
|
{
|
||||||
|
mainMember.AppendLine();
|
||||||
|
mainMember.Append(" { CustomAttributes = new List<Attribute>");
|
||||||
|
mainMember.Append($" {{ {string.Join(", ", attributeInitializers)} }} }}");
|
||||||
|
}
|
||||||
|
|
||||||
|
initializerLines.Add(mainMember.ToString());
|
||||||
|
|
||||||
|
// 处理元组元素,(暂不需要处理元组元素的特性)
|
||||||
|
if (prop.Type is INamedTypeSymbol { IsTupleType: true } tupleType)
|
||||||
|
{
|
||||||
|
foreach (var element in tupleType.TupleElements)
|
||||||
|
{
|
||||||
|
var elementType = element.Type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat);//元组元素的类型
|
||||||
|
var elementName = element.Name;//元组元素名称
|
||||||
|
var elementDeclaredName = element.Type.Name;//元组元素类型名称
|
||||||
|
|
||||||
|
initializerLines.Add(
|
||||||
|
$"new EntityMemberInfo(" +
|
||||||
|
$"\"{prop.Name}.{elementName}\", " +
|
||||||
|
$"typeof({elementType}), " +
|
||||||
|
$"\"{elementDeclaredName}\", " +
|
||||||
|
$"(e) => Get{prop.Name}_{elementName}(({entityType})e), " +
|
||||||
|
$"(e, v) => Set{prop.Name}_{elementName}(({entityType})e, ({elementType})v))");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
code.AppendLine(string.Join(",\n", initializerLines));
|
||||||
|
code.AppendLine(" };");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private static string GenerateAttributeInitializer(AttributeData attribute)
|
||||||
|
{
|
||||||
|
if (attribute.AttributeClass == null)
|
||||||
|
return string.Empty;
|
||||||
|
|
||||||
|
var attributeClass = attribute.AttributeClass.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat);
|
||||||
|
var args = attribute.ConstructorArguments;
|
||||||
|
var namedArgs = attribute.NamedArguments;
|
||||||
|
|
||||||
|
var parameters = new List<string>();
|
||||||
|
foreach (var arg in args)
|
||||||
|
{
|
||||||
|
parameters.Add(ConvertTypedConstantToCode(arg));
|
||||||
|
}
|
||||||
|
|
||||||
|
var constructorArgs = string.Join(", ", parameters);
|
||||||
|
|
||||||
|
var initializer = new StringBuilder();
|
||||||
|
initializer.Append($"new {attributeClass}({constructorArgs})");
|
||||||
|
|
||||||
|
if (namedArgs.Any())
|
||||||
|
{
|
||||||
|
initializer.Append(" { ");
|
||||||
|
var namedArgsList = namedArgs.Select(n => $"{n.Key} = {ConvertTypedConstantToCode(n.Value)}");
|
||||||
|
initializer.Append(string.Join(", ", namedArgsList));
|
||||||
|
initializer.Append(" }");
|
||||||
|
}
|
||||||
|
|
||||||
|
return initializer.ToString();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static string ConvertTypedConstantToCode(TypedConstant constant)
|
||||||
|
{
|
||||||
|
if (constant.IsNull)
|
||||||
|
return "null";
|
||||||
|
|
||||||
|
switch (constant.Kind)
|
||||||
|
{
|
||||||
|
case TypedConstantKind.Array:
|
||||||
|
var elements = constant.Values.Select(ConvertTypedConstantToCode);
|
||||||
|
return $"new[] {{ {string.Join(", ", elements)} }}";
|
||||||
|
case TypedConstantKind.Type:
|
||||||
|
var typeSymbol = (ITypeSymbol)constant.Value!;
|
||||||
|
return $"typeof({typeSymbol.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat)})";
|
||||||
|
case TypedConstantKind.Enum:
|
||||||
|
return ConvertEnumTypedConstant(constant);
|
||||||
|
default:
|
||||||
|
return ConvertPrimitiveConstant(constant);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static string ConvertEnumTypedConstant(TypedConstant constant)
|
||||||
|
{
|
||||||
|
var enumType = constant.Type!;
|
||||||
|
var enumValue = constant.Value!;
|
||||||
|
var enumTypeName = enumType.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat);
|
||||||
|
|
||||||
|
foreach (var member in enumType.GetMembers().OfType<IFieldSymbol>())
|
||||||
|
{
|
||||||
|
if (member.ConstantValue != null && member.ConstantValue.Equals(enumValue))
|
||||||
|
return $"{enumTypeName}.{member.Name}";
|
||||||
|
}
|
||||||
|
|
||||||
|
return $"({enumTypeName})({enumValue})";
|
||||||
|
}
|
||||||
|
|
||||||
|
private static string ConvertPrimitiveConstant(TypedConstant constant)
|
||||||
|
{
|
||||||
|
var value = constant.Value!;
|
||||||
|
return value switch
|
||||||
|
{
|
||||||
|
string s => $"\"{s}\"",
|
||||||
|
char c => $"'{c}'",
|
||||||
|
bool b => b ? "true" : "false",
|
||||||
|
_ => value.ToString()
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private static bool IsCompilerGeneratedAttribute(AttributeData attribute)
|
||||||
|
{
|
||||||
|
return attribute.AttributeClass?.ToDisplayString() == "System.Runtime.CompilerServices.CompilerGeneratedAttribute";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取枚举的参数
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="enumType"></param>
|
||||||
|
/// <param name="value"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
private static string GetEnumMemberName(INamedTypeSymbol enumType, int value)
|
||||||
|
{
|
||||||
|
foreach (var member in enumType.GetMembers().OfType<IFieldSymbol>())
|
||||||
|
{
|
||||||
|
if (member.ConstantValue is int intValue && intValue == value)
|
||||||
|
{
|
||||||
|
return $"{enumType.ToDisplayString()}.{member.Name}";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $"{enumType.ToDisplayString()}.Other";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1,19 +0,0 @@
|
|||||||
using JiShe.CollectBus.IoTDB.Enums;
|
|
||||||
|
|
||||||
namespace JiShe.CollectBus.IoTDB.Attribute
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// IoTDB实体类型特性
|
|
||||||
/// </summary>
|
|
||||||
[AttributeUsage(AttributeTargets.Class)]
|
|
||||||
public class EntityTypeAttribute : System.Attribute
|
|
||||||
{
|
|
||||||
public EntityTypeEnum EntityType { get; }
|
|
||||||
|
|
||||||
|
|
||||||
public EntityTypeAttribute(EntityTypeEnum entityType)
|
|
||||||
{
|
|
||||||
EntityType = entityType;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,4 +1,4 @@
|
|||||||
namespace JiShe.CollectBus.IoTDB.Attribute
|
namespace JiShe.CollectBus.IoTDB.Attributes
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Column分类标记特性(ATTRIBUTE字段),也就是属性字段
|
/// Column分类标记特性(ATTRIBUTE字段),也就是属性字段
|
||||||
@ -1,4 +1,4 @@
|
|||||||
namespace JiShe.CollectBus.IoTDB.Attribute
|
namespace JiShe.CollectBus.IoTDB.Attributes
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Column分类标记特性(FIELD字段),数据列字段
|
/// Column分类标记特性(FIELD字段),数据列字段
|
||||||
@ -1,4 +1,4 @@
|
|||||||
namespace JiShe.CollectBus.IoTDB.Attribute
|
namespace JiShe.CollectBus.IoTDB.Attributes
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 用于标识当前实体为单侧点模式,单侧点模式只有一个Filed标识字段,类型是Tuple<string,T>,Item1=>测点名称,Item2=>测点值,泛型
|
/// 用于标识当前实体为单侧点模式,单侧点模式只有一个Filed标识字段,类型是Tuple<string,T>,Item1=>测点名称,Item2=>测点值,泛型
|
||||||
@ -1,4 +1,4 @@
|
|||||||
namespace JiShe.CollectBus.IoTDB.Attribute
|
namespace JiShe.CollectBus.IoTDB.Attributes
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Column分类标记特性(TAG字段),标签字段
|
/// Column分类标记特性(TAG字段),标签字段
|
||||||
@ -1,6 +1,5 @@
|
|||||||
using JiShe.CollectBus.IoTDB.Enums;
|
|
||||||
|
namespace JiShe.CollectBus.IoTDB.Attributes
|
||||||
namespace JiShe.CollectBus.IoTDB.Attribute
|
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// IoTDB实体存储路径或表名称,一般用于已经明确的存储路径或表名称,例如日志存储
|
/// IoTDB实体存储路径或表名称,一般用于已经明确的存储路径或表名称,例如日志存储
|
||||||
22
modules/JiShe.CollectBus.IoTDB/Exceptions/IoTException.cs
Normal file
22
modules/JiShe.CollectBus.IoTDB/Exceptions/IoTException.cs
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace JiShe.CollectBus.IoTDB.Exceptions
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// IoTDB异常
|
||||||
|
/// </summary>
|
||||||
|
public class IoTException : Exception
|
||||||
|
{
|
||||||
|
public int ErrorCode { get; }
|
||||||
|
|
||||||
|
public IoTException(string message, int errorCode)
|
||||||
|
: base($"{message} (Code: {errorCode})")
|
||||||
|
{
|
||||||
|
ErrorCode = errorCode;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -14,7 +14,6 @@
|
|||||||
<ProjectReference Include="..\..\shared\JiShe.CollectBus.Analyzers.Shared\JiShe.CollectBus.Analyzers.Shared.csproj" />
|
<ProjectReference Include="..\..\shared\JiShe.CollectBus.Analyzers.Shared\JiShe.CollectBus.Analyzers.Shared.csproj" />
|
||||||
<ProjectReference Include="..\..\shared\JiShe.CollectBus.Common\JiShe.CollectBus.Common.csproj" />
|
<ProjectReference Include="..\..\shared\JiShe.CollectBus.Common\JiShe.CollectBus.Common.csproj" />
|
||||||
|
|
||||||
<ProjectReference Include="..\..\modules\JiShe.CollectBus.Analyzers\JiShe.CollectBus.Analyzers.csproj"
|
<ProjectReference Include="..\..\modules\JiShe.CollectBus.Analyzers\JiShe.CollectBus.Analyzers.csproj" OutputItemType="Analyzer" ReferenceOutputAssembly="false" />
|
||||||
OutputItemType="Analyzer" ReferenceOutputAssembly="false"/>
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
||||||
|
|||||||
12
modules/JiShe.CollectBus.IoTDB/Model/Class1.cs
Normal file
12
modules/JiShe.CollectBus.IoTDB/Model/Class1.cs
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace JiShe.CollectBus.IoTDB.Model
|
||||||
|
{
|
||||||
|
internal class Class1
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,5 +1,6 @@
|
|||||||
using JiShe.CollectBus.Common.Attributes;
|
using JiShe.CollectBus.Common.Attributes;
|
||||||
using JiShe.CollectBus.IoTDB.Attribute;
|
using JiShe.CollectBus.Common.Consts;
|
||||||
|
using JiShe.CollectBus.IoTDB.Attributes;
|
||||||
|
|
||||||
namespace JiShe.CollectBus.IoTDB.Model
|
namespace JiShe.CollectBus.IoTDB.Model
|
||||||
{
|
{
|
||||||
@ -20,6 +21,12 @@ namespace JiShe.CollectBus.IoTDB.Model
|
|||||||
[TAGColumn]
|
[TAGColumn]
|
||||||
public string ProjectId { get; set; }
|
public string ProjectId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 数据类型
|
||||||
|
/// </summary>
|
||||||
|
[TAGColumn]
|
||||||
|
public string DataType { get; set; } = IOTDBDataTypeConst.Data;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 设备类型集中器、电表、水表、流量计、传感器等
|
/// 设备类型集中器、电表、水表、流量计、传感器等
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@ -1,20 +1,18 @@
|
|||||||
using JiShe.CollectBus.Analyzers.Shared;
|
using JiShe.CollectBus.Analyzers.Shared;
|
||||||
using JiShe.CollectBus.IoTDB.Attribute;
|
using JiShe.CollectBus.IoTDB.Attributes;
|
||||||
using JiShe.CollectBus.IoTDB.Enums;
|
|
||||||
|
|
||||||
namespace JiShe.CollectBus.IoTDB.Model
|
namespace JiShe.CollectBus.IoTDB.Model
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Table模型单项数据实体
|
/// Table模型单项数据实体
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[EntityType(EntityTypeEnum.TableModel)]
|
[SourceAnalyzers(EntityTypeEnum.TableModel)]
|
||||||
[SourceAnalyzers]
|
|
||||||
public class TableModelSingleMeasuringEntity<T> : IoTEntity
|
public class TableModelSingleMeasuringEntity<T> : IoTEntity
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 单项数据键值对
|
/// 单项数据键值对
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[SingleMeasuring(nameof(SingleColumn))]
|
[SingleMeasuring(nameof(SingleColumn))]
|
||||||
public required Tuple<string, T> SingleColumn { get; set; }
|
public required ValueTuple<string, T> SingleColumn { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,20 +1,18 @@
|
|||||||
using JiShe.CollectBus.Analyzers.Shared;
|
using JiShe.CollectBus.Analyzers.Shared;
|
||||||
using JiShe.CollectBus.IoTDB.Attribute;
|
using JiShe.CollectBus.IoTDB.Attributes;
|
||||||
using JiShe.CollectBus.IoTDB.Enums;
|
|
||||||
|
|
||||||
namespace JiShe.CollectBus.IoTDB.Model
|
namespace JiShe.CollectBus.IoTDB.Model
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Tree模型单项数据实体
|
/// Tree模型单项数据实体
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[EntityType(EntityTypeEnum.TreeModel)]
|
[SourceAnalyzers(EntityTypeEnum.TreeModel)]
|
||||||
[SourceAnalyzers]
|
|
||||||
public class TreeModelSingleMeasuringEntity<T> : IoTEntity
|
public class TreeModelSingleMeasuringEntity<T> : IoTEntity
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 单项数据键值对
|
/// 单项数据键值对
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[SingleMeasuring(nameof(SingleMeasuring))]
|
[SingleMeasuring(nameof(SingleMeasuring))]
|
||||||
public required Tuple<string, T> SingleMeasuring { get; set; }
|
public required ValueTuple<string, T> SingleMeasuring { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
using Apache.IoTDB;
|
using Apache.IoTDB;
|
||||||
using JiShe.CollectBus.IoTDB.Enums;
|
using JiShe.CollectBus.Analyzers.Shared;
|
||||||
|
|
||||||
namespace JiShe.CollectBus.IoTDB.Provider
|
namespace JiShe.CollectBus.IoTDB.Provider
|
||||||
{
|
{
|
||||||
@ -9,9 +9,9 @@ namespace JiShe.CollectBus.IoTDB.Provider
|
|||||||
public class DeviceMetadata
|
public class DeviceMetadata
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// IoTDB实体类型枚举
|
/// 实体类型枚举
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public EntityTypeEnum EntityType { get; set; }
|
public EntityTypeEnum? EntityType { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 是否有单测量值
|
/// 是否有单测量值
|
||||||
|
|||||||
@ -15,7 +15,7 @@ namespace JiShe.CollectBus.IoTDB.Provider
|
|||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public static string GetDevicePath<T>(T entity) where T : IoTEntity
|
public static string GetDevicePath<T>(T entity) where T : IoTEntity
|
||||||
{
|
{
|
||||||
return $"root.{entity.SystemName.ToLower()}.`{entity.ProjectId}`.`{entity.DeviceType}`.`{entity.DeviceId}`";
|
return $"root.{entity.SystemName.ToLower()}.`{entity.ProjectId}`.`{entity.DeviceType}`.{entity.DataType}.`{entity.DeviceId}`";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -12,7 +12,7 @@ using JiShe.CollectBus.Common.Enums;
|
|||||||
using JiShe.CollectBus.Common.Extensions;
|
using JiShe.CollectBus.Common.Extensions;
|
||||||
using JiShe.CollectBus.Common.Helpers;
|
using JiShe.CollectBus.Common.Helpers;
|
||||||
using JiShe.CollectBus.Common.Models;
|
using JiShe.CollectBus.Common.Models;
|
||||||
using JiShe.CollectBus.IoTDB.Attribute;
|
using JiShe.CollectBus.IoTDB.Attributes;
|
||||||
using JiShe.CollectBus.IoTDB.Context;
|
using JiShe.CollectBus.IoTDB.Context;
|
||||||
using JiShe.CollectBus.IoTDB.Interface;
|
using JiShe.CollectBus.IoTDB.Interface;
|
||||||
using JiShe.CollectBus.IoTDB.Model;
|
using JiShe.CollectBus.IoTDB.Model;
|
||||||
@ -20,6 +20,8 @@ using JiShe.CollectBus.IoTDB.Options;
|
|||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
using Volo.Abp.DependencyInjection;
|
using Volo.Abp.DependencyInjection;
|
||||||
using Volo.Abp.Domain.Entities;
|
using Volo.Abp.Domain.Entities;
|
||||||
|
using JiShe.CollectBus.Analyzers.Shared;
|
||||||
|
using JiShe.CollectBus.IoTDB.Exceptions;
|
||||||
|
|
||||||
namespace JiShe.CollectBus.IoTDB.Provider
|
namespace JiShe.CollectBus.IoTDB.Provider
|
||||||
{
|
{
|
||||||
@ -176,14 +178,16 @@ namespace JiShe.CollectBus.IoTDB.Provider
|
|||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public async Task<DeviceMetadata> GetMetadata<T>() where T : IoTEntity
|
public async Task<DeviceMetadata> GetMetadata<T>() where T : IoTEntity
|
||||||
{
|
{
|
||||||
var columns = CollectColumnMetadata(typeof(T));
|
var accessor = SourceEntityAccessorFactory.GetAccessor<T>();
|
||||||
|
|
||||||
|
var columns = CollectColumnMetadata<T>(accessor);
|
||||||
var metadata = BuildDeviceMetadata<T>(columns);
|
var metadata = BuildDeviceMetadata<T>(columns);
|
||||||
var metaData = MetadataCache.AddOrUpdate(
|
var metaData = MetadataCache.AddOrUpdate(
|
||||||
typeof(T),
|
typeof(T),
|
||||||
addValueFactory: t => metadata, // 如果键不存在,用此值添加
|
addValueFactory: t => metadata, // 如果键不存在,用此值添加
|
||||||
updateValueFactory: (t, existingValue) =>
|
updateValueFactory: (t, existingValue) =>
|
||||||
{
|
{
|
||||||
var columns = CollectColumnMetadata(t);
|
var columns = CollectColumnMetadata(accessor);
|
||||||
var metadata = BuildDeviceMetadata<T>(columns);
|
var metadata = BuildDeviceMetadata<T>(columns);
|
||||||
|
|
||||||
//对现有值 existingValue 进行修改,返回新值
|
//对现有值 existingValue 进行修改,返回新值
|
||||||
@ -192,6 +196,8 @@ namespace JiShe.CollectBus.IoTDB.Provider
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
metadata.EntityType = accessor.EntityType;
|
||||||
|
|
||||||
return await Task.FromResult(metaData);
|
return await Task.FromResult(metaData);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -245,146 +251,337 @@ namespace JiShe.CollectBus.IoTDB.Provider
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
///// <summary>
|
||||||
|
///// 构建Tablet
|
||||||
|
///// </summary>
|
||||||
|
///// <typeparam name="T"></typeparam>
|
||||||
|
///// <param name="entities">表实体</param>
|
||||||
|
///// <param name="metadata">设备元数据</param></param>
|
||||||
|
///// <returns></returns>
|
||||||
|
//private Tablet BuildTablet<T>(IEnumerable<T> entities, DeviceMetadata metadata) where T : IoTEntity
|
||||||
|
//{
|
||||||
|
// var timestamps = new List<long>();
|
||||||
|
// var values = new List<List<object>>();
|
||||||
|
// var devicePaths = new HashSet<string>();
|
||||||
|
// List<string> tempColumnNames = new List<string>();
|
||||||
|
// tempColumnNames.AddRange(metadata.ColumnNames);
|
||||||
|
|
||||||
|
// var accessor = SourceEntityAccessorFactory.GetAccessor<T>();
|
||||||
|
|
||||||
|
// var memberCache = new Dictionary<string, EntityMemberInfo>(); // 缓存优化查询
|
||||||
|
// // 预构建成员缓存(Key: NameOrPath)
|
||||||
|
// foreach (var member in accessor.MemberList)
|
||||||
|
// {
|
||||||
|
// memberCache[member.NameOrPath] = member;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// if (accessor.EntityType == null || metadata.EntityType == null)
|
||||||
|
// {
|
||||||
|
// throw new ArgumentException($"{nameof(BuildTablet)} 构建存储结构{nameof(Tablet)}时 {nameof(T)}的EntityType 没有指定,属于异常情况,-101");
|
||||||
|
// }
|
||||||
|
|
||||||
|
// if (metadata.EntityType != accessor.EntityType)
|
||||||
|
// {
|
||||||
|
// throw new ArgumentException($"{nameof(BuildTablet)} 构建存储结构{nameof(Tablet)}时 {nameof(T)}的EntityType 和{nameof(DeviceMetadata)}的 EntityType 不一致,属于异常情况,-102");
|
||||||
|
// }
|
||||||
|
|
||||||
|
// if (metadata.EntityType == EntityTypeEnum.TreeModel && _runtimeContext.UseTableSessionPool == true)
|
||||||
|
// {
|
||||||
|
// throw new ArgumentException($"{nameof(BuildTablet)} 构建存储结构{nameof(Tablet)}时 tree模型不能使用table模型Session连接,属于异常情况,-103");
|
||||||
|
// }
|
||||||
|
// else if (metadata.EntityType == EntityTypeEnum.TableModel && _runtimeContext.UseTableSessionPool == false)
|
||||||
|
// {
|
||||||
|
// throw new ArgumentException($"{nameof(BuildTablet)} 构建存储结构{nameof(Tablet)}时 table模型不能使用tree模型Session连接,属于异常情况,-104");
|
||||||
|
// }
|
||||||
|
|
||||||
|
// string tableNameOrTreePath = string.Empty;
|
||||||
|
// var tableNameOrTreePathAttribute = typeof(T).GetCustomAttribute<TableNameOrTreePathAttribute>();
|
||||||
|
// if (tableNameOrTreePathAttribute != null)
|
||||||
|
// {
|
||||||
|
// tableNameOrTreePath = tableNameOrTreePathAttribute.TableNameOrTreePath;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// foreach (var entity in entities)
|
||||||
|
// {
|
||||||
|
// timestamps.Add(entity.Timestamps);
|
||||||
|
// var rowValues = new List<object>();
|
||||||
|
|
||||||
|
// foreach (var measurement in metadata.ColumnNames)
|
||||||
|
// {
|
||||||
|
// if (!memberCache.TryGetValue(measurement, out var member))
|
||||||
|
// {
|
||||||
|
// throw new ArgumentException($"{nameof(BuildTablet)} 构建存储结构时{accessor.EntityName}没有找到{measurement}对应的member信息,-105");
|
||||||
|
// }
|
||||||
|
|
||||||
|
// var value = member.GetValue(entity);
|
||||||
|
|
||||||
|
// // 特性查询优化
|
||||||
|
// var attributes = member.CustomAttributes ?? Enumerable.Empty<Attribute>();
|
||||||
|
// var singleMeasuringAttr = attributes.OfType<SingleMeasuringAttribute>().FirstOrDefault();
|
||||||
|
// if (singleMeasuringAttr != null)//如果是单侧点
|
||||||
|
// {
|
||||||
|
|
||||||
|
// var tupleItem1Key = $"{member.NameOrPath}.Item1";
|
||||||
|
// if (!memberCache.TryGetValue(tupleItem1Key, out var tuple1Member))
|
||||||
|
// {
|
||||||
|
// throw new ArgumentException($"{nameof(BuildTablet)} 构建存储结构时{accessor.EntityName} 没有找到{measurement}对应的member Item1 信息,-106");
|
||||||
|
// }
|
||||||
|
// int indexOf = metadata.ColumnNames.IndexOf(measurement);
|
||||||
|
// tempColumnNames[indexOf] = (string)tuple1Member.GetValue(entity);
|
||||||
|
|
||||||
|
// var tupleItem2Key = $"{member.NameOrPath}.Item2";
|
||||||
|
// if (!memberCache.TryGetValue(tupleItem2Key, out var tuple2Member))
|
||||||
|
// {
|
||||||
|
// throw new ArgumentException($"{nameof(BuildTablet)} 构建存储结构时{accessor.EntityName} 没有找到{measurement}对应的member Item2 信息,-107");
|
||||||
|
// }
|
||||||
|
|
||||||
|
// value = tuple2Member.GetValue(entity);
|
||||||
|
// }
|
||||||
|
|
||||||
|
// if (value != null)
|
||||||
|
// {
|
||||||
|
// var tempValue = member.DeclaredTypeName.ToUpper() switch
|
||||||
|
// {
|
||||||
|
// "DATETIME" => Convert.ToDateTime(value).GetDateTimeOffset().ToUnixTimeNanoseconds(),
|
||||||
|
// _ => value
|
||||||
|
// };
|
||||||
|
|
||||||
|
// rowValues.Add(tempValue);
|
||||||
|
// }
|
||||||
|
// else
|
||||||
|
// {
|
||||||
|
// rowValues.Add(value);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// values.Add(rowValues);
|
||||||
|
|
||||||
|
// //如果指定了路径
|
||||||
|
// if (!string.IsNullOrWhiteSpace(tableNameOrTreePath))
|
||||||
|
// {
|
||||||
|
// devicePaths.Add(tableNameOrTreePath);
|
||||||
|
// }
|
||||||
|
// else
|
||||||
|
// {
|
||||||
|
// if (!_runtimeContext.UseTableSessionPool)//树模型
|
||||||
|
// {
|
||||||
|
// devicePaths.Add(DevicePathBuilder.GetDevicePath(entity));
|
||||||
|
// }
|
||||||
|
// else
|
||||||
|
// {
|
||||||
|
// devicePaths.Add(DevicePathBuilder.GetTableName<T>());
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// if (devicePaths.Count > 1)
|
||||||
|
// {
|
||||||
|
// throw new Exception($"{nameof(BuildTablet)} 构建Tablet《{typeof(T).Name}》时,批量插入的设备路径不一致。");
|
||||||
|
// }
|
||||||
|
|
||||||
|
// return _runtimeContext.UseTableSessionPool
|
||||||
|
// ? BuildTableSessionTablet(metadata, devicePaths.First(), tempColumnNames, values, timestamps)
|
||||||
|
// : BuildSessionTablet(metadata, devicePaths.First(), tempColumnNames,values, timestamps);
|
||||||
|
//}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 构建Tablet
|
/// 构建Tablet
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <typeparam name="T"></typeparam>
|
/// <typeparam name="T"></typeparam>
|
||||||
/// <param name="entities">表实体</param>
|
/// <param name="entities">表实体集合</param>
|
||||||
/// <param name="metadata">设备元数据</param></param>
|
/// <param name="metadata">设备元数据</param></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
private Tablet BuildTablet<T>(IEnumerable<T> entities, DeviceMetadata metadata) where T : IoTEntity
|
private Tablet BuildTablet<T>(IEnumerable<T> entities, DeviceMetadata metadata) where T : IoTEntity
|
||||||
{
|
{
|
||||||
var timestamps = new List<long>();
|
// 前置校验
|
||||||
var values = new List<List<object>>();
|
ValidateMetadataAndAccessor<T>(metadata, out var accessor);
|
||||||
var devicePaths = new HashSet<string>();
|
|
||||||
List<string> tempColumnNames = new List<string>();
|
|
||||||
tempColumnNames.AddRange(metadata.ColumnNames);
|
|
||||||
|
|
||||||
var entityTypeAttribute = typeof(T).GetCustomAttribute<EntityTypeAttribute>();
|
// 初始化数据结构
|
||||||
|
var (timestamps, values, devicePaths) = (new List<long>(), new List<List<object>>(), new HashSet<string>());
|
||||||
if (entityTypeAttribute == null)
|
var tempColumnNames = new List<string>(metadata.ColumnNames);
|
||||||
{
|
var memberCache = BuildMemberCache(accessor);
|
||||||
throw new ArgumentException($"{nameof(BuildTablet)} 构建存储结构{nameof(Tablet)}时 {nameof(T)}的EntityType 没有指定,属于异常情况,-101");
|
var tableNameOrTreePath = GetTableNameOrTreePath<T>();
|
||||||
}
|
|
||||||
|
|
||||||
if (metadata.EntityType != entityTypeAttribute.EntityType)
|
|
||||||
{
|
|
||||||
throw new ArgumentException($"{nameof(BuildTablet)} 构建存储结构{nameof(Tablet)}时 {nameof(T)}的EntityType 和{nameof(DeviceMetadata)}的 EntityType 不一致,属于异常情况,-102");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (metadata.EntityType == Enums.EntityTypeEnum.TreeModel && _runtimeContext.UseTableSessionPool == true)
|
|
||||||
{
|
|
||||||
throw new ArgumentException($"{nameof(BuildTablet)} 构建存储结构{nameof(Tablet)}时 tree模型不能使用table模型Session连接,属于异常情况,-103");
|
|
||||||
}
|
|
||||||
else if (metadata.EntityType == Enums.EntityTypeEnum.TableModel && _runtimeContext.UseTableSessionPool == false)
|
|
||||||
{
|
|
||||||
throw new ArgumentException($"{nameof(BuildTablet)} 构建存储结构{nameof(Tablet)}时 table模型不能使用tree模型Session连接,属于异常情况,-104");
|
|
||||||
}
|
|
||||||
|
|
||||||
string tableNameOrTreePath = string.Empty;
|
|
||||||
var tableNameOrTreePathAttribute = typeof(T).GetCustomAttribute<TableNameOrTreePathAttribute>();
|
|
||||||
if (tableNameOrTreePathAttribute != null)
|
|
||||||
{
|
|
||||||
tableNameOrTreePath = tableNameOrTreePathAttribute.TableNameOrTreePath;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
// 处理每个实体
|
||||||
foreach (var entity in entities)
|
foreach (var entity in entities)
|
||||||
|
{
|
||||||
|
ProcessEntity(entity, accessor, metadata, memberCache, tempColumnNames, timestamps, values);
|
||||||
|
UpdateDevicePaths(entity, tableNameOrTreePath, devicePaths);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 后置校验与返回
|
||||||
|
ValidateDevicePaths(devicePaths);
|
||||||
|
// return CreateFinalTablet(metadata, devicePaths.First(), tempColumnNames, values, timestamps);
|
||||||
|
return _runtimeContext.UseTableSessionPool
|
||||||
|
? BuildTableSessionTablet(metadata, devicePaths.First(), tempColumnNames, values, timestamps)
|
||||||
|
: BuildSessionTablet(metadata, devicePaths.First(), tempColumnNames, values, timestamps);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ValidateMetadataAndAccessor<T>(DeviceMetadata metadata, out ISourceEntityAccessor<T> accessor) where T : IoTEntity
|
||||||
|
{
|
||||||
|
accessor = SourceEntityAccessorFactory.GetAccessor<T>();
|
||||||
|
|
||||||
|
if (accessor.EntityType == null || metadata.EntityType == null)
|
||||||
|
{
|
||||||
|
throw new IoTException($"{nameof(BuildTablet)} 构建IoTDB数据结构时,EntityType未指定", -101);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (metadata.EntityType != accessor.EntityType)
|
||||||
|
{
|
||||||
|
throw new IoTException($"{nameof(BuildTablet)} 构建IoTDB数据结构时,EntityType不一致", -102);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool isTableModel = accessor.EntityType == EntityTypeEnum.TableModel;
|
||||||
|
if (_runtimeContext.UseTableSessionPool != isTableModel)
|
||||||
|
{
|
||||||
|
throw new IoTException($"{nameof(BuildTablet)} 构建IoTDB数据结构时,Session类型不匹配: 预期{(isTableModel ? "Table" : "Tree")}模型", isTableModel ? -104 : -103);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 处理实体并获取值
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="T"></typeparam>
|
||||||
|
/// <param name="entity"></param>
|
||||||
|
/// <param name="accessor"></param>
|
||||||
|
/// <param name="metadata"></param>
|
||||||
|
/// <param name="memberCache"></param>
|
||||||
|
/// <param name="tempColumnNames"></param>
|
||||||
|
/// <param name="timestamps"></param>
|
||||||
|
/// <param name="values"></param>
|
||||||
|
/// <exception cref="IoTException"></exception>
|
||||||
|
private void ProcessEntity<T>(
|
||||||
|
T entity,
|
||||||
|
ISourceEntityAccessor<T> accessor,
|
||||||
|
DeviceMetadata metadata,
|
||||||
|
Dictionary<string, EntityMemberInfo> memberCache,
|
||||||
|
List<string> tempColumnNames,
|
||||||
|
List<long> timestamps,
|
||||||
|
List<List<object>> values) where T : IoTEntity
|
||||||
{
|
{
|
||||||
timestamps.Add(entity.Timestamps);
|
timestamps.Add(entity.Timestamps);
|
||||||
var rowValues = new List<object>();
|
var rowValues = new object[metadata.ColumnNames.Count];
|
||||||
|
|
||||||
foreach (var measurement in tempColumnNames)
|
Parallel.ForEach(metadata.ColumnNames, (measurement, state, index) =>
|
||||||
{
|
{
|
||||||
|
if (!memberCache.TryGetValue(measurement, out var member))
|
||||||
PropertyInfo propertyInfo = typeof(T).GetProperty(measurement);
|
|
||||||
if (propertyInfo == null)
|
|
||||||
{
|
{
|
||||||
throw new Exception($"{nameof(BuildTablet)} 构建表模型{typeof(T).Name}时,没有找到{measurement}属性,属于异常情况,-101。");
|
throw new IoTException($"{nameof(BuildTablet)} 构建IoTDB数据结构时,找不到成员: {measurement}", -105);
|
||||||
}
|
}
|
||||||
|
|
||||||
var value = propertyInfo.GetValue(entity);
|
object value = ResolveMemberValue(entity, member, memberCache, tempColumnNames, (int)index);
|
||||||
if (propertyInfo.IsDefined(typeof(SingleMeasuringAttribute), false) && metadata.IsSingleMeasuring == true)//表示当前对象是单测点模式
|
rowValues[index] = ConvertValueByType(member, value);
|
||||||
{
|
});
|
||||||
if (value != null)
|
|
||||||
{
|
values.Add(rowValues.ToList());
|
||||||
Type tupleType = value.GetType();
|
|
||||||
Type[] tupleArgs = tupleType.GetGenericArguments();
|
|
||||||
Type item2Type = tupleArgs[1]; // T 的实际类型
|
|
||||||
var item1 = tupleType.GetProperty("Item1")!.GetValue(value);
|
|
||||||
var item2 = tupleType.GetProperty("Item2")!.GetValue(value);
|
|
||||||
if (item1 == null || item2 == null)
|
|
||||||
{
|
|
||||||
throw new Exception($"{nameof(BuildTablet)} 构建表模型{typeof(T).Name}时,单测点模式构建失败,没有获取测点名称或者测点值,-102。");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var indexOf = metadata.ColumnNames.IndexOf(measurement);
|
private object ResolveMemberValue<T>(
|
||||||
metadata.ColumnNames[indexOf] = (string)item1!;
|
T entity,
|
||||||
|
EntityMemberInfo member,
|
||||||
rowValues.Add(item2);
|
Dictionary<string, EntityMemberInfo> memberCache,
|
||||||
}
|
List<string> tempColumnNames,
|
||||||
else
|
int columnIndex) where T : IoTEntity
|
||||||
{
|
{
|
||||||
rowValues.Add(null);
|
// 单测点逻辑
|
||||||
|
if (member.CustomAttributes?.OfType<SingleMeasuringAttribute>().FirstOrDefault() is { } attr)
|
||||||
|
{
|
||||||
|
var tuple1Key = $"{member.NameOrPath}.Item1";
|
||||||
|
var tuple2Key = $"{member.NameOrPath}.Item2";
|
||||||
|
|
||||||
|
if (!memberCache.TryGetValue(tuple1Key, out var tuple1) || !memberCache.TryGetValue(tuple2Key, out var tuple2))
|
||||||
|
{
|
||||||
|
throw new IoTException($"{nameof(BuildTablet)} 构建IoTDB数据结构时,单侧点元组成员缺失", -106);
|
||||||
}
|
}
|
||||||
|
|
||||||
//同时如果是单测点模式,且是table模型存储,路径只能通过DevicePathBuilder.GetDeviceTableName(entity)获取
|
tempColumnNames[columnIndex] = (string)tuple1.GetValue(entity);
|
||||||
if (_runtimeContext.UseTableSessionPool)
|
return tuple2.GetValue(entity);
|
||||||
{
|
|
||||||
tableNameOrTreePath = DevicePathBuilder.GetDeviceTableName(entity);
|
|
||||||
}
|
}
|
||||||
|
return member.GetValue(entity);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
|
|
||||||
//需要根据value的类型,进行相应的值映射转换,例如datetime转换为long的时间戳值
|
/// <summary>
|
||||||
if (value != null)
|
/// 设置实体的成员值
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="member"></param>
|
||||||
|
/// <param name="value"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
private object ConvertValueByType(EntityMemberInfo member, object value)
|
||||||
{
|
{
|
||||||
Type tupleType = value.GetType();
|
return member.DeclaredTypeName switch
|
||||||
var tempValue = tupleType.Name.ToUpper() switch
|
|
||||||
{
|
{
|
||||||
"DATETIME" => Convert.ToDateTime(value).GetDateTimeOffset().ToUnixTimeNanoseconds(),
|
"DATETIME" => Convert.ToDateTime(value).GetDateTimeOffset().ToUnixTimeNanoseconds(),
|
||||||
_ => value
|
_ => value
|
||||||
};
|
};
|
||||||
|
|
||||||
rowValues.Add(tempValue);
|
|
||||||
}
|
}
|
||||||
else
|
|
||||||
|
/// <summary>
|
||||||
|
/// 处理设备路径
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="T"></typeparam>
|
||||||
|
/// <param name="entity"></param>
|
||||||
|
/// <param name="tableNameOrTreePath"></param>
|
||||||
|
/// <param name="devicePaths"></param>
|
||||||
|
private void UpdateDevicePaths<T>(
|
||||||
|
T entity,
|
||||||
|
string tableNameOrTreePath,
|
||||||
|
HashSet<string> devicePaths) where T : IoTEntity
|
||||||
{
|
{
|
||||||
rowValues.Add(value);
|
if (!string.IsNullOrEmpty(tableNameOrTreePath))
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
values.Add(rowValues);
|
|
||||||
|
|
||||||
//如果指定了路径
|
|
||||||
if (!string.IsNullOrWhiteSpace(tableNameOrTreePath))
|
|
||||||
{
|
{
|
||||||
devicePaths.Add(tableNameOrTreePath);
|
devicePaths.Add(tableNameOrTreePath);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
|
var path = _runtimeContext.UseTableSessionPool
|
||||||
|
? DevicePathBuilder.GetTableName<T>()
|
||||||
|
: DevicePathBuilder.GetDevicePath(entity);
|
||||||
|
devicePaths.Add(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 验证设备路径
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="devicePaths"></param>
|
||||||
|
private void ValidateDevicePaths(HashSet<string> devicePaths)
|
||||||
{
|
{
|
||||||
if (!_runtimeContext.UseTableSessionPool)//树模型
|
if (devicePaths.Count == 0)
|
||||||
{
|
{
|
||||||
devicePaths.Add(DevicePathBuilder.GetDevicePath(entity));
|
throw new IoTException($"{nameof(BuildTablet)} 构建IoTDB数据结构时,设备路径集合为空", -108);
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
devicePaths.Add(DevicePathBuilder.GetTableName<T>());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (devicePaths.Count > 1)
|
if (devicePaths.Count > 1)
|
||||||
{
|
{
|
||||||
throw new Exception($"{nameof(BuildTablet)} 构建Tablet《{typeof(T).Name}》时,批量插入的设备路径不一致。");
|
var paths = string.Join(", ", devicePaths.Take(3));
|
||||||
|
{
|
||||||
|
throw new IoTException($"{nameof(BuildTablet)} 构建IoTDB数据结构时,设备路径不一致。检测到路径: {paths}...", -109);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return _runtimeContext.UseTableSessionPool
|
/// <summary>
|
||||||
? BuildTableSessionTablet(metadata, devicePaths.First(), values, timestamps)
|
/// 缓存优化:避免重复反射
|
||||||
: BuildSessionTablet(metadata, devicePaths.First(), values, timestamps);
|
/// </summary>
|
||||||
|
/// <typeparam name="T"></typeparam>
|
||||||
|
/// <returns></returns>
|
||||||
|
private string GetTableNameOrTreePath<T>()
|
||||||
|
{
|
||||||
|
return AttributeCache<T>.TableNameOrTreePath;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 特性缓存辅助类
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="T"></typeparam>
|
||||||
|
private static class AttributeCache<T>
|
||||||
|
{
|
||||||
|
public static readonly string TableNameOrTreePath;
|
||||||
|
|
||||||
|
static AttributeCache()
|
||||||
|
{
|
||||||
|
var attr = typeof(T).GetCustomAttribute<TableNameOrTreePathAttribute>();
|
||||||
|
TableNameOrTreePath = attr?.TableNameOrTreePath ?? string.Empty;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -392,16 +589,17 @@ namespace JiShe.CollectBus.IoTDB.Provider
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="metadata">已解析的设备数据元数据</param>
|
/// <param name="metadata">已解析的设备数据元数据</param>
|
||||||
/// <param name="devicePath">设备路径</param>
|
/// <param name="devicePath">设备路径</param>
|
||||||
|
/// <param name="columns">数据列集合</param>
|
||||||
/// <param name="values">数据集合</param>
|
/// <param name="values">数据集合</param>
|
||||||
/// <param name="timestamps">时间戳集合</param>
|
/// <param name="timestamps">时间戳集合</param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
private Tablet BuildSessionTablet(DeviceMetadata metadata, string devicePath, List<List<object>> values, List<long> timestamps)
|
private Tablet BuildSessionTablet(DeviceMetadata metadata, string devicePath, List<string> columns, List<List<object>> values, List<long> timestamps)
|
||||||
{
|
{
|
||||||
//todo 树模型需要去掉TAG类型和ATTRIBUTE类型的字段,只需要保留FIELD类型字段即可
|
//todo 树模型需要去掉TAG类型和ATTRIBUTE类型的字段,只需要保留FIELD类型字段即可
|
||||||
|
|
||||||
return new Tablet(
|
return new Tablet(
|
||||||
devicePath,
|
devicePath,
|
||||||
metadata.ColumnNames,
|
columns,
|
||||||
metadata.DataTypes,
|
metadata.DataTypes,
|
||||||
values,
|
values,
|
||||||
timestamps
|
timestamps
|
||||||
@ -413,14 +611,15 @@ namespace JiShe.CollectBus.IoTDB.Provider
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="metadata">已解析的设备数据元数据</param>
|
/// <param name="metadata">已解析的设备数据元数据</param>
|
||||||
/// <param name="tableName">表名称</param>
|
/// <param name="tableName">表名称</param>
|
||||||
|
/// <param name="columns">数据列集合</param>
|
||||||
/// <param name="values">数据集合</param>
|
/// <param name="values">数据集合</param>
|
||||||
/// <param name="timestamps">时间戳集合</param>
|
/// <param name="timestamps">时间戳集合</param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
private Tablet BuildTableSessionTablet(DeviceMetadata metadata, string tableName, List<List<object>> values, List<long> timestamps)
|
private Tablet BuildTableSessionTablet(DeviceMetadata metadata, string tableName, List<string> columns,List<List<object>> values, List<long> timestamps)
|
||||||
{
|
{
|
||||||
var tablet = new Tablet(
|
var tablet = new Tablet(
|
||||||
tableName,
|
tableName,
|
||||||
metadata.ColumnNames,
|
columns,
|
||||||
metadata.ColumnCategories,
|
metadata.ColumnCategories,
|
||||||
metadata.DataTypes,
|
metadata.DataTypes,
|
||||||
values,
|
values,
|
||||||
@ -547,14 +746,14 @@ namespace JiShe.CollectBus.IoTDB.Provider
|
|||||||
var results = new List<T>();
|
var results = new List<T>();
|
||||||
var metadata = await GetMetadata<T>();
|
var metadata = await GetMetadata<T>();
|
||||||
|
|
||||||
var properties = typeof(T).GetProperties();
|
var accessor = SourceEntityAccessorFactory.GetAccessor<T>();
|
||||||
|
var memberCache = BuildMemberCache(accessor);
|
||||||
|
|
||||||
var columns = new List<string>() { "Timestamps" };
|
var columns = new List<string>() { "Timestamps" };
|
||||||
var dataTypes = new List<TSDataType>() { TSDataType.TIMESTAMP };
|
var dataTypes = new List<TSDataType>() { TSDataType.TIMESTAMP };
|
||||||
columns.AddRange(metadata.ColumnNames);
|
columns.AddRange(metadata.ColumnNames);
|
||||||
dataTypes.AddRange(metadata.DataTypes);
|
dataTypes.AddRange(metadata.DataTypes);
|
||||||
//metadata.ColumnNames.Insert(0, "Timestamps");
|
|
||||||
//metadata.DataTypes.Insert(0, TSDataType.TIMESTAMP);
|
|
||||||
|
|
||||||
while (dataSet.HasNext() && results.Count < pageSize)
|
while (dataSet.HasNext() && results.Count < pageSize)
|
||||||
{
|
{
|
||||||
@ -570,20 +769,20 @@ namespace JiShe.CollectBus.IoTDB.Provider
|
|||||||
var value = record.Values[indexOf];
|
var value = record.Values[indexOf];
|
||||||
TSDataType tSDataType = dataTypes[indexOf];
|
TSDataType tSDataType = dataTypes[indexOf];
|
||||||
|
|
||||||
var prop = properties.FirstOrDefault(p =>
|
if (!memberCache.TryGetValue(measurement, out var member) && !(value is System.DBNull))
|
||||||
p.Name.Equals(measurement, StringComparison.OrdinalIgnoreCase));
|
|
||||||
if (prop != null && !(value is System.DBNull))
|
|
||||||
{
|
{
|
||||||
|
throw new Exception($"{nameof(ParseResults)} 解析查询结果 {accessor.EntityName} 属性赋值出现异常,没有找到{measurement}对应的 member信息");
|
||||||
|
}
|
||||||
|
|
||||||
dynamic tempValue = GetTSDataValue(tSDataType, value);
|
dynamic tempValue = GetTSDataValue(tSDataType, value);
|
||||||
|
|
||||||
if (measurement.ToLower().EndsWith("time"))
|
if (measurement.ToLower().EndsWith("time"))
|
||||||
{
|
{
|
||||||
typeof(T).GetProperty(measurement)?.SetValue(entity, TimestampHelper.ConvertToDateTime(tempValue, TimestampUnit.Nanoseconds));
|
member.Setter(entity, TimestampHelper.ConvertToDateTime(tempValue, TimestampUnit.Nanoseconds));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
typeof(T).GetProperty(measurement)?.SetValue(entity, tempValue);
|
member.Setter(entity, tempValue);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -598,72 +797,57 @@ namespace JiShe.CollectBus.IoTDB.Provider
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 获取设备元数据的列
|
/// 获取设备元数据的列
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="type"></param>
|
/// <param name="accessor"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
private List<ColumnInfo> CollectColumnMetadata(Type type)
|
private List<ColumnInfo> CollectColumnMetadata<T>(ISourceEntityAccessor<T> accessor)
|
||||||
{
|
{
|
||||||
var columns = new List<ColumnInfo>();
|
var columns = new List<ColumnInfo>();
|
||||||
|
var memberCache = BuildMemberCache(accessor);
|
||||||
|
|
||||||
foreach (var prop in type.GetProperties())
|
foreach (var member in accessor.MemberList)
|
||||||
{
|
{
|
||||||
|
// 过滤元组子项
|
||||||
|
if (member.NameOrPath.Contains(".Item")) continue;
|
||||||
|
|
||||||
string typeName = string.Empty;
|
// 类型名称处理
|
||||||
|
Type declaredType = member.DeclaredType;
|
||||||
|
var underlyingType = Nullable.GetUnderlyingType(declaredType);
|
||||||
|
string declaredTypeName = underlyingType?.Name ?? member.DeclaredTypeName;
|
||||||
|
|
||||||
Type declaredType = prop.PropertyType;
|
// 特性查询优化
|
||||||
// 处理可空类型
|
var attributes = member.CustomAttributes ?? Enumerable.Empty<Attribute>();
|
||||||
if (declaredType.IsGenericType && declaredType.GetGenericTypeDefinition() == typeof(Nullable<>))
|
var tagAttr = attributes.OfType<TAGColumnAttribute>().FirstOrDefault();
|
||||||
|
var attrColumn = attributes.OfType<ATTRIBUTEColumnAttribute>().FirstOrDefault();
|
||||||
|
var fieldColumn = attributes.OfType<FIELDColumnAttribute>().FirstOrDefault();
|
||||||
|
var singleMeasuringAttr = attributes.OfType<SingleMeasuringAttribute>().FirstOrDefault();
|
||||||
|
|
||||||
|
// 构建ColumnInfo
|
||||||
|
ColumnInfo? column = null;
|
||||||
|
if (tagAttr != null)
|
||||||
{
|
{
|
||||||
Type underlyingType = Nullable.GetUnderlyingType(declaredType);
|
column = new ColumnInfo(member.NameOrPath, ColumnCategory.TAG, GetDataTypeFromTypeName(declaredTypeName), false);
|
||||||
typeName = underlyingType.Name;
|
|
||||||
}
|
}
|
||||||
else
|
else if (attrColumn != null)
|
||||||
{
|
{
|
||||||
typeName = declaredType.Name;
|
column = new ColumnInfo(member.NameOrPath, ColumnCategory.ATTRIBUTE, GetDataTypeFromTypeName(declaredTypeName), false);
|
||||||
|
}
|
||||||
|
else if (fieldColumn != null)
|
||||||
|
{
|
||||||
|
column = new ColumnInfo(member.NameOrPath, ColumnCategory.FIELD, GetDataTypeFromTypeName(declaredTypeName), false);
|
||||||
}
|
}
|
||||||
|
|
||||||
//先获取Tag标签和属性标签
|
// 单测模式处理
|
||||||
ColumnInfo? column = prop.GetCustomAttribute<TAGColumnAttribute>() is not null ? new ColumnInfo(
|
if (singleMeasuringAttr != null && column == null)
|
||||||
name: prop.Name,
|
|
||||||
category: ColumnCategory.TAG,
|
|
||||||
dataType: GetDataTypeFromTypeName(typeName),
|
|
||||||
false
|
|
||||||
) : prop.GetCustomAttribute<ATTRIBUTEColumnAttribute>() is not null ? new ColumnInfo(
|
|
||||||
prop.Name,
|
|
||||||
ColumnCategory.ATTRIBUTE,
|
|
||||||
GetDataTypeFromTypeName(typeName),
|
|
||||||
false
|
|
||||||
) : prop.GetCustomAttribute<FIELDColumnAttribute>() is not null ? new ColumnInfo(
|
|
||||||
prop.Name,
|
|
||||||
ColumnCategory.FIELD,
|
|
||||||
GetDataTypeFromTypeName(typeName),
|
|
||||||
false)
|
|
||||||
: null;
|
|
||||||
|
|
||||||
//最先检查是不是单侧点模式
|
|
||||||
SingleMeasuringAttribute singleMeasuringAttribute = prop.GetCustomAttribute<SingleMeasuringAttribute>();
|
|
||||||
|
|
||||||
if (singleMeasuringAttribute != null && column == null)
|
|
||||||
{
|
{
|
||||||
//warning: 单侧点模式注意事项
|
var tupleItemKey = $"{member.NameOrPath}.Item2";
|
||||||
//Entity实体 字段类型是 Tuple<string,T>,Item1=>测点名称,Item2=>测点值,泛型
|
if (!memberCache.TryGetValue(tupleItemKey, out var tupleMember))
|
||||||
//只有一个Filed字段。
|
{
|
||||||
//MeasuringName 默认为 SingleMeasuringAttribute.FieldName,以便于在获取对应的Value的时候重置为 Item1 的值。
|
throw new Exception($"{nameof(CollectColumnMetadata)} {accessor.EntityName} {member.NameOrPath} 单侧点属性解析异常");
|
||||||
|
}
|
||||||
Type tupleType = prop.PropertyType;
|
column = new ColumnInfo(member.NameOrPath, ColumnCategory.FIELD, GetDataTypeFromTypeName(tupleMember.DeclaredTypeName), true);
|
||||||
Type[] tupleArgs = tupleType.GetGenericArguments();
|
|
||||||
|
|
||||||
column = new ColumnInfo(
|
|
||||||
singleMeasuringAttribute.FieldName,
|
|
||||||
ColumnCategory.FIELD,
|
|
||||||
GetDataTypeFromTypeName(tupleArgs[1].Name),
|
|
||||||
true
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (column.HasValue)
|
if (column.HasValue) columns.Add(column.Value);
|
||||||
{
|
|
||||||
columns.Add(column.Value);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return columns;
|
return columns;
|
||||||
}
|
}
|
||||||
@ -693,15 +877,6 @@ namespace JiShe.CollectBus.IoTDB.Provider
|
|||||||
ProcessCategory(groupedColumns, ColumnCategory.ATTRIBUTE, metadata);
|
ProcessCategory(groupedColumns, ColumnCategory.ATTRIBUTE, metadata);
|
||||||
ProcessCategory(groupedColumns, ColumnCategory.FIELD, metadata);
|
ProcessCategory(groupedColumns, ColumnCategory.FIELD, metadata);
|
||||||
|
|
||||||
var entityTypeAttribute = typeof(T).GetCustomAttribute<EntityTypeAttribute>();
|
|
||||||
|
|
||||||
if (entityTypeAttribute == null)
|
|
||||||
{
|
|
||||||
throw new ArgumentException($"{nameof(BuildDeviceMetadata)} 构建设备元数据时 {nameof(IoTEntity)} 的EntityType 没有指定,属于异常情况,-101");
|
|
||||||
}
|
|
||||||
|
|
||||||
metadata.EntityType = entityTypeAttribute.EntityType;
|
|
||||||
|
|
||||||
return metadata;
|
return metadata;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -832,5 +1007,21 @@ namespace JiShe.CollectBus.IoTDB.Provider
|
|||||||
TSDataType.STRING => Convert.ToString(value),
|
TSDataType.STRING => Convert.ToString(value),
|
||||||
_ => Convert.ToString(value)
|
_ => Convert.ToString(value)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 缓存实体属性信息
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="T"></typeparam>
|
||||||
|
/// <param name="accessor"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
private Dictionary<string, EntityMemberInfo> BuildMemberCache<T>(ISourceEntityAccessor<T> accessor)
|
||||||
|
{
|
||||||
|
var cache = new Dictionary<string, EntityMemberInfo>(StringComparer.Ordinal);
|
||||||
|
foreach (var member in accessor.MemberList)
|
||||||
|
{
|
||||||
|
cache[member.NameOrPath] = member;
|
||||||
|
}
|
||||||
|
return cache;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -37,6 +37,9 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_00H
|
|||||||
TimeDensity = -1
|
TimeDensity = -1
|
||||||
};
|
};
|
||||||
result?.Invoke(dto);
|
result?.Invoke(dto);
|
||||||
|
#if DEBUG
|
||||||
|
_logger.LogWarning($"全部否认:{input.A.Code}-{input.DT.Fn}-{input.BaseHexMessage.HexMessageString}");
|
||||||
|
#endif
|
||||||
return Task.FromResult(true);
|
return Task.FromResult(true);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
|
|||||||
@ -33,7 +33,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0CH
|
|||||||
ArgumentNullException.ThrowIfNull(input);
|
ArgumentNullException.ThrowIfNull(input);
|
||||||
ArgumentNullException.ThrowIfNull(input.UnitData?.HexMessageList);
|
ArgumentNullException.ThrowIfNull(input.UnitData?.HexMessageList);
|
||||||
ArgumentNullException.ThrowIfNull(input.A.A3?.D1_D7);
|
ArgumentNullException.ThrowIfNull(input.A.A3?.D1_D7);
|
||||||
UnitDataAnalysis<List<AnalysisBaseDto<decimal>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal>>>
|
UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>>
|
||||||
{
|
{
|
||||||
Code = input.A.Code!,
|
Code = input.A.Code!,
|
||||||
AFN = input.AFN_FC.AFN,
|
AFN = input.AFN_FC.AFN,
|
||||||
@ -48,7 +48,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0CH
|
|||||||
TimeDensity = 0
|
TimeDensity = 0
|
||||||
};
|
};
|
||||||
List<string> datas = await AnalysisDataUnitAsync(input.UnitData.HexMessageList);
|
List<string> datas = await AnalysisDataUnitAsync(input.UnitData.HexMessageList);
|
||||||
List<AnalysisBaseDto<decimal>> list = GenerateFinalResult(2, datas, "正向有功电能示值", input.AFN_FC.AFN, input.DT.Fn);
|
List<AnalysisBaseDto<decimal?>> list = GenerateFinalResult(2, datas, "正向有功电能示值", input.AFN_FC.AFN, input.DT.Fn);
|
||||||
unitDataAnalysis.Data= list;
|
unitDataAnalysis.Data= list;
|
||||||
result?.Invoke(unitDataAnalysis);
|
result?.Invoke(unitDataAnalysis);
|
||||||
return await Task.FromResult(true);
|
return await Task.FromResult(true);
|
||||||
@ -90,22 +90,32 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0CH
|
|||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
public List<AnalysisBaseDto<decimal>> GenerateFinalResult(int index, List<string> data, string filedDesc = "", int afn = 0, int fn = 0)
|
public List<AnalysisBaseDto<decimal?>> GenerateFinalResult(int index, List<string> data, string filedDesc = "", int afn = 0, int fn = 0)
|
||||||
{
|
{
|
||||||
List<AnalysisBaseDto<decimal>> list = new List<AnalysisBaseDto<decimal>>();
|
List<AnalysisBaseDto<decimal?>> list = new List<AnalysisBaseDto<decimal?>>();
|
||||||
for (int i = index; i < data.Count; i++)
|
for (int i = index; i < data.Count; i++)
|
||||||
{
|
{
|
||||||
AnalysisBaseDto<decimal> meter = new AnalysisBaseDto<decimal>();
|
AnalysisBaseDto<decimal?> meter = new AnalysisBaseDto<decimal?>
|
||||||
|
{
|
||||||
decimal value = 0;
|
DeviceType = MeterTypeEnum.Ammeter
|
||||||
|
};
|
||||||
var errorCode = data[i].CheckErrorCode();
|
var errorCode = data[i].CheckErrorCode();
|
||||||
if (errorCode != null)
|
if (errorCode != null)
|
||||||
|
{
|
||||||
|
meter.ErrorCodeMsg= errorCode.Item2;
|
||||||
meter.ValidData = false;
|
meter.ValidData = false;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
decimal.TryParse(data[i], out value);
|
{
|
||||||
|
if(decimal.TryParse(data[i], out decimal value))
|
||||||
meter.DataValue = value;
|
meter.DataValue = value;
|
||||||
|
}
|
||||||
meter.DataType = $"{afn.ToString().PadLeft(2, '0')}_{fn}_{i - index}";
|
meter.DataType = $"{afn.ToString().PadLeft(2, '0')}_{fn}_{i - index}";
|
||||||
meter.TimeSpan = Convert.ToDateTime($"{data[0].Substring(0, 4)}-{data[0].Substring(4, 2)}-{data[0].Substring(6, 2)} {data[0].Substring(8, 2)}:{data[0].Substring(10, 2)}:00");
|
string timeSpan = $"{data[0].Substring(0, 4)}-{data[0].Substring(4, 2)}-{data[0].Substring(6, 2)} {data[0].Substring(8, 2)}:{data[0].Substring(10, 2)}:00";
|
||||||
|
if (DateTime.TryParse(timeSpan, out DateTime readingDate))
|
||||||
|
{
|
||||||
|
meter.TimeSpan = readingDate;
|
||||||
|
}
|
||||||
meter.FiledDesc = filedDesc;
|
meter.FiledDesc = filedDesc;
|
||||||
meter.FiledName = meter.DataType.GetDataFieldByGatherDataType() ?? string.Empty;
|
meter.FiledName = meter.DataType.GetDataFieldByGatherDataType() ?? string.Empty;
|
||||||
list.Add(meter);
|
list.Add(meter);
|
||||||
|
|||||||
@ -31,8 +31,8 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0CH
|
|||||||
ArgumentNullException.ThrowIfNull(input);
|
ArgumentNullException.ThrowIfNull(input);
|
||||||
ArgumentNullException.ThrowIfNull(input.UnitData?.HexMessageList);
|
ArgumentNullException.ThrowIfNull(input.UnitData?.HexMessageList);
|
||||||
List<string> datas = await AnalysisDataUnitAsync(input.UnitData.HexMessageList);
|
List<string> datas = await AnalysisDataUnitAsync(input.UnitData.HexMessageList);
|
||||||
List<AnalysisBaseDto<decimal>> list = GenerateFinalResult(2, datas, "正向无功电能示值", input.AFN_FC.AFN, input.DT.Fn);
|
List<AnalysisBaseDto<decimal?>> list = GenerateFinalResult(2, datas, "正向无功电能示值", input.AFN_FC.AFN, input.DT.Fn);
|
||||||
UnitDataAnalysis<List<AnalysisBaseDto<decimal>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal>>>
|
UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>>
|
||||||
{
|
{
|
||||||
Code = input.A.Code!,
|
Code = input.A.Code!,
|
||||||
AFN = input.AFN_FC.AFN,
|
AFN = input.AFN_FC.AFN,
|
||||||
@ -78,21 +78,30 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0CH
|
|||||||
}
|
}
|
||||||
return values;
|
return values;
|
||||||
}
|
}
|
||||||
public List<AnalysisBaseDto<decimal>> GenerateFinalResult(int index, List<string> data, string filedDesc = "", int afn = 0, int fn = 0)
|
public List<AnalysisBaseDto<decimal?>> GenerateFinalResult(int index, List<string> data, string filedDesc = "", int afn = 0, int fn = 0)
|
||||||
{
|
{
|
||||||
List<AnalysisBaseDto<decimal>> list = new List<AnalysisBaseDto<decimal>>();
|
List<AnalysisBaseDto<decimal?>> list = new List<AnalysisBaseDto<decimal?>>();
|
||||||
for (int i = index; i < data.Count; i++)
|
for (int i = index; i < data.Count; i++)
|
||||||
{
|
{
|
||||||
AnalysisBaseDto<decimal> meter = new AnalysisBaseDto<decimal>();
|
AnalysisBaseDto<decimal?> meter = new AnalysisBaseDto<decimal?>
|
||||||
decimal value = 0;
|
{
|
||||||
|
DeviceType = MeterTypeEnum.Ammeter
|
||||||
|
};
|
||||||
var errorCode = data[i].CheckErrorCode();
|
var errorCode = data[i].CheckErrorCode();
|
||||||
if (errorCode != null)
|
if (errorCode != null)
|
||||||
|
{
|
||||||
|
meter.ErrorCodeMsg = errorCode.Item2;
|
||||||
meter.ValidData = false;
|
meter.ValidData = false;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
decimal.TryParse(data[i], out value);
|
{
|
||||||
|
if(decimal.TryParse(data[i], out decimal value))
|
||||||
meter.DataValue = value;
|
meter.DataValue = value;
|
||||||
|
}
|
||||||
meter.DataType = $"{afn.ToString().PadLeft(2, '0')}_{fn}_{i - index}";
|
meter.DataType = $"{afn.ToString().PadLeft(2, '0')}_{fn}_{i - index}";
|
||||||
meter.TimeSpan = Convert.ToDateTime($"{data[0].Substring(0, 4)}-{data[0].Substring(4, 2)}-{data[0].Substring(6, 2)} {data[0].Substring(8, 2)}:{data[0].Substring(10, 2)}:00");
|
string timeSpan = $"{data[0].Substring(0, 4)}-{data[0].Substring(4, 2)}-{data[0].Substring(6, 2)} {data[0].Substring(8, 2)}:{data[0].Substring(10, 2)}:00";
|
||||||
|
if(DateTime.TryParse(timeSpan, out DateTime readingDate))
|
||||||
|
meter.TimeSpan = readingDate;
|
||||||
meter.FiledDesc = filedDesc;
|
meter.FiledDesc = filedDesc;
|
||||||
meter.FiledName = meter.DataType.GetDataFieldByGatherDataType() ?? string.Empty;
|
meter.FiledName = meter.DataType.GetDataFieldByGatherDataType() ?? string.Empty;
|
||||||
list.Add(meter);
|
list.Add(meter);
|
||||||
|
|||||||
@ -6,6 +6,8 @@ using JiShe.CollectBus.Protocol.Interfaces;
|
|||||||
using JiShe.CollectBus.Protocol.T37612012.Appendix;
|
using JiShe.CollectBus.Protocol.T37612012.Appendix;
|
||||||
using JiShe.CollectBus.Protocol3761;
|
using JiShe.CollectBus.Protocol3761;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
|
using Newtonsoft.Json.Linq;
|
||||||
|
using YamlDotNet.Core.Tokens;
|
||||||
|
|
||||||
namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0CH
|
namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0CH
|
||||||
{
|
{
|
||||||
@ -30,8 +32,8 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0CH
|
|||||||
ArgumentNullException.ThrowIfNull(input);
|
ArgumentNullException.ThrowIfNull(input);
|
||||||
ArgumentNullException.ThrowIfNull(input.UnitData?.HexMessageList);
|
ArgumentNullException.ThrowIfNull(input.UnitData?.HexMessageList);
|
||||||
List<string> datas = await AnalysisDataUnitAsync(input.UnitData.HexMessageList);
|
List<string> datas = await AnalysisDataUnitAsync(input.UnitData.HexMessageList);
|
||||||
List<AnalysisBaseDto<decimal>> list = GenerateFinalResult(2, datas, "反向有功总电能示值", input.AFN_FC.AFN, input.DT.Fn);
|
List<AnalysisBaseDto<decimal?>> list = GenerateFinalResult(2, datas, "反向有功总电能示值", input.AFN_FC.AFN, input.DT.Fn);
|
||||||
UnitDataAnalysis<List<AnalysisBaseDto<decimal>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal>>>
|
UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>>
|
||||||
{
|
{
|
||||||
Code = input.A.Code!,
|
Code = input.A.Code!,
|
||||||
AFN = input.AFN_FC.AFN,
|
AFN = input.AFN_FC.AFN,
|
||||||
@ -78,21 +80,30 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0CH
|
|||||||
}
|
}
|
||||||
return values;
|
return values;
|
||||||
}
|
}
|
||||||
public List<AnalysisBaseDto<decimal>> GenerateFinalResult(int index, List<string> data, string filedDesc = "", int afn = 0, int fn = 0)
|
public List<AnalysisBaseDto<decimal?>> GenerateFinalResult(int index, List<string> data, string filedDesc = "", int afn = 0, int fn = 0)
|
||||||
{
|
{
|
||||||
List<AnalysisBaseDto<decimal>> list = new List<AnalysisBaseDto<decimal>>();
|
List<AnalysisBaseDto<decimal?>> list = new List<AnalysisBaseDto<decimal?>>();
|
||||||
for (int i = index; i < data.Count; i++)
|
for (int i = index; i < data.Count; i++)
|
||||||
{
|
{
|
||||||
AnalysisBaseDto<decimal> meter = new AnalysisBaseDto<decimal>();
|
AnalysisBaseDto<decimal?> meter = new AnalysisBaseDto<decimal?>
|
||||||
decimal value = 0;
|
{
|
||||||
|
DeviceType = MeterTypeEnum.Ammeter
|
||||||
|
};
|
||||||
var errorCode = data[i].CheckErrorCode();
|
var errorCode = data[i].CheckErrorCode();
|
||||||
if (errorCode != null)
|
if (errorCode != null)
|
||||||
|
{
|
||||||
|
meter.ErrorCodeMsg = errorCode.Item2;
|
||||||
meter.ValidData = false;
|
meter.ValidData = false;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
decimal.TryParse(data[i], out value);
|
{
|
||||||
|
if(decimal.TryParse(data[i], out decimal value))
|
||||||
meter.DataValue = value;
|
meter.DataValue = value;
|
||||||
|
}
|
||||||
meter.DataType = $"{afn.ToString().PadLeft(2, '0')}_{fn}_{i - index}";
|
meter.DataType = $"{afn.ToString().PadLeft(2, '0')}_{fn}_{i - index}";
|
||||||
meter.TimeSpan = Convert.ToDateTime($"{data[0].Substring(0, 4)}-{data[0].Substring(4, 2)}-{data[0].Substring(6, 2)} {data[0].Substring(8, 2)}:{data[0].Substring(10, 2)}:00");
|
string timeSpan = $"{data[0].Substring(0, 4)}-{data[0].Substring(4, 2)}-{data[0].Substring(6, 2)} {data[0].Substring(8, 2)}:{data[0].Substring(10, 2)}:00";
|
||||||
|
if(DateTime.TryParse(timeSpan, out DateTime readTime))
|
||||||
|
meter.TimeSpan = readTime;
|
||||||
meter.FiledDesc = filedDesc;
|
meter.FiledDesc = filedDesc;
|
||||||
meter.FiledName = meter.DataType.GetDataFieldByGatherDataType() ?? string.Empty;
|
meter.FiledName = meter.DataType.GetDataFieldByGatherDataType() ?? string.Empty;
|
||||||
list.Add(meter);
|
list.Add(meter);
|
||||||
|
|||||||
@ -7,6 +7,7 @@ using JiShe.CollectBus.Protocol.Interfaces;
|
|||||||
using JiShe.CollectBus.Protocol.T37612012.Appendix;
|
using JiShe.CollectBus.Protocol.T37612012.Appendix;
|
||||||
using JiShe.CollectBus.Protocol3761;
|
using JiShe.CollectBus.Protocol3761;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
|
using YamlDotNet.Core.Tokens;
|
||||||
|
|
||||||
namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0CH
|
namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0CH
|
||||||
{
|
{
|
||||||
@ -34,9 +35,8 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0CH
|
|||||||
ArgumentNullException.ThrowIfNull(input.UnitData?.HexMessageList);
|
ArgumentNullException.ThrowIfNull(input.UnitData?.HexMessageList);
|
||||||
List<string> datas = await AnalysisDataUnitAsync(input.UnitData.HexMessageList);
|
List<string> datas = await AnalysisDataUnitAsync(input.UnitData.HexMessageList);
|
||||||
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
||||||
|
List<AnalysisBaseDto<decimal?>> list = GenerateFinalResult(2, datas, "反向无功电能示值", dataType);
|
||||||
List<AnalysisBaseDto<decimal>> list = GenerateFinalResult(2, datas, "反向无功电能示值", dataType);
|
UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>>
|
||||||
UnitDataAnalysis<List<AnalysisBaseDto<decimal>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal>>>
|
|
||||||
{
|
{
|
||||||
Code = input.A.Code!,
|
Code = input.A.Code!,
|
||||||
AFN = input.AFN_FC.AFN,
|
AFN = input.AFN_FC.AFN,
|
||||||
@ -82,21 +82,33 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0CH
|
|||||||
}
|
}
|
||||||
return values;
|
return values;
|
||||||
}
|
}
|
||||||
public List<AnalysisBaseDto<decimal>> GenerateFinalResult(int index, List<string> data, string dataType, string filedDesc = "")
|
public List<AnalysisBaseDto<decimal?>> GenerateFinalResult(int index, List<string> data, string dataType, string filedDesc = "")
|
||||||
{
|
{
|
||||||
List<AnalysisBaseDto<decimal>> list = new List<AnalysisBaseDto<decimal>>();
|
List<AnalysisBaseDto<decimal?>> list = new List<AnalysisBaseDto<decimal?>>();
|
||||||
for (int i = index; i < data.Count; i++)
|
for (int i = index; i < data.Count; i++)
|
||||||
{
|
{
|
||||||
AnalysisBaseDto<decimal> meter = new AnalysisBaseDto<decimal>();
|
AnalysisBaseDto<decimal?> meter = new AnalysisBaseDto<decimal?>
|
||||||
decimal value = 0;
|
{
|
||||||
|
DeviceType = MeterTypeEnum.Ammeter
|
||||||
|
};
|
||||||
var errorCode = data[i].CheckErrorCode();
|
var errorCode = data[i].CheckErrorCode();
|
||||||
if (errorCode != null)
|
if (errorCode != null)
|
||||||
|
{
|
||||||
|
meter.ErrorCodeMsg = errorCode.Item2;
|
||||||
meter.ValidData = false;
|
meter.ValidData = false;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
decimal.TryParse(data[i], out value);
|
{
|
||||||
|
if(decimal.TryParse(data[i], out decimal value))
|
||||||
meter.DataValue = value;
|
meter.DataValue = value;
|
||||||
|
}
|
||||||
|
|
||||||
meter.DataType = $"{dataType}_{i - index}";
|
meter.DataType = $"{dataType}_{i - index}";
|
||||||
meter.TimeSpan = Convert.ToDateTime($"{data[0].Substring(0, 4)}-{data[0].Substring(4, 2)}-{data[0].Substring(6, 2)} {data[0].Substring(8, 2)}:{data[0].Substring(10, 2)}:00");
|
string timeSpan = $"{data[0].Substring(0, 4)}-{data[0].Substring(4, 2)}-{data[0].Substring(6, 2)} {data[0].Substring(8, 2)}:{data[0].Substring(10, 2)}:00";
|
||||||
|
if (DateTime.TryParse(timeSpan,out DateTime readingDate))
|
||||||
|
{
|
||||||
|
meter.TimeSpan = readingDate;
|
||||||
|
}
|
||||||
meter.FiledDesc = filedDesc;
|
meter.FiledDesc = filedDesc;
|
||||||
meter.FiledName = meter.DataType.GetDataFieldByGatherDataType() ?? string.Empty;
|
meter.FiledName = meter.DataType.GetDataFieldByGatherDataType() ?? string.Empty;
|
||||||
list.Add(meter);
|
list.Add(meter);
|
||||||
|
|||||||
@ -35,8 +35,8 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0CH
|
|||||||
List<string> datas = await AnalysisDataUnitAsync(input.UnitData.HexMessageList);
|
List<string> datas = await AnalysisDataUnitAsync(input.UnitData.HexMessageList);
|
||||||
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
||||||
|
|
||||||
AnalysisBaseDto<decimal> data = GenerateFinalResult(datas, "当月正向有功最大需量及发生时间", dataType);
|
AnalysisBaseDto<decimal?> data = GenerateFinalResult(datas, "当月正向有功最大需量及发生时间", dataType);
|
||||||
UnitDataAnalysis<AnalysisBaseDto<decimal>> unitDataAnalysis = new UnitDataAnalysis<AnalysisBaseDto<decimal>>
|
UnitDataAnalysis<AnalysisBaseDto<decimal?>> unitDataAnalysis = new UnitDataAnalysis<AnalysisBaseDto<decimal?>>
|
||||||
{
|
{
|
||||||
Code = input.A.Code!,
|
Code = input.A.Code!,
|
||||||
AFN = input.AFN_FC.AFN,
|
AFN = input.AFN_FC.AFN,
|
||||||
@ -96,19 +96,25 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0CH
|
|||||||
return values;
|
return values;
|
||||||
}
|
}
|
||||||
|
|
||||||
public AnalysisBaseDto<decimal> GenerateFinalResult(List<string> data, string filedDesc,string dataType)
|
public AnalysisBaseDto<decimal?> GenerateFinalResult(List<string> data, string filedDesc,string dataType)
|
||||||
{
|
{
|
||||||
AnalysisBaseDto<decimal> dto = new AnalysisBaseDto<decimal>();
|
AnalysisBaseDto<decimal?> dto = new AnalysisBaseDto<decimal?>
|
||||||
|
{
|
||||||
decimal value = 0;
|
DeviceType = MeterTypeEnum.Ammeter
|
||||||
|
};
|
||||||
var errorCode = data[2].CheckErrorCode();
|
var errorCode = data[2].CheckErrorCode();
|
||||||
if (errorCode != null)
|
if (errorCode != null)
|
||||||
|
{
|
||||||
|
dto.ErrorCodeMsg = errorCode.Item2;
|
||||||
dto.ValidData = false;
|
dto.ValidData = false;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
decimal.TryParse(data[2], out value);
|
{
|
||||||
|
if(decimal.TryParse(data[2], out decimal value))
|
||||||
dto.DataValue = value;
|
dto.DataValue = value;
|
||||||
string timeSpan = $"{DateTime.Now.Year}-{data[3].Substring(0, 2)}-{data[3].Substring(2, 2)} {data[3].Substring(4, 2)}:{data[3].Substring(6, 2)}:00";//$"{data[0].Substring(0, 4)}-{data[0].Substring(4, 2)}-{data[0].Substring(6, 2)}";
|
}
|
||||||
|
|
||||||
|
string timeSpan = $"{DateTime.Now.Year}-{data[3].Substring(0, 2)}-{data[3].Substring(2, 2)} {data[3].Substring(4, 2)}:{data[3].Substring(6, 2)}:00";
|
||||||
if (DateTime.TryParse(timeSpan, out DateTime readingDate))
|
if (DateTime.TryParse(timeSpan, out DateTime readingDate))
|
||||||
{
|
{
|
||||||
dto.TimeSpan = readingDate;
|
dto.TimeSpan = readingDate;
|
||||||
|
|||||||
@ -38,7 +38,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AFN_0CH
|
|||||||
List<string> datas = await AnalysisDataUnit(input.UnitData.HexMessageList);
|
List<string> datas = await AnalysisDataUnit(input.UnitData.HexMessageList);
|
||||||
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
||||||
|
|
||||||
AnalysisBaseDto<decimal> data = GenerateFinalResult(datas, dataType,"上月(上一结算日)正向有功最大需量及发生时间");
|
AnalysisBaseDto<decimal?> data = GenerateFinalResult(datas, dataType,"上月(上一结算日)正向有功最大需量及发生时间");
|
||||||
// 查询电表信息
|
// 查询电表信息
|
||||||
AmmeterInfo ammeterInfo = await _dataStorage.GetMeterInfoAsync(data.DeviceType.ToString(), "15");
|
AmmeterInfo ammeterInfo = await _dataStorage.GetMeterInfoAsync(data.DeviceType.ToString(), "15");
|
||||||
if (ammeterInfo != null)
|
if (ammeterInfo != null)
|
||||||
@ -48,7 +48,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AFN_0CH
|
|||||||
data.DatabaseBusiID=ammeterInfo.DatabaseBusiID;
|
data.DatabaseBusiID=ammeterInfo.DatabaseBusiID;
|
||||||
data.DeviceAddress= ammeterInfo.AmmerterAddress;
|
data.DeviceAddress= ammeterInfo.AmmerterAddress;
|
||||||
}
|
}
|
||||||
UnitDataAnalysis<AnalysisBaseDto<decimal>> unitDataAnalysis = new UnitDataAnalysis<AnalysisBaseDto<decimal>>
|
UnitDataAnalysis<AnalysisBaseDto<decimal?>> unitDataAnalysis = new UnitDataAnalysis<AnalysisBaseDto<decimal?>>
|
||||||
{
|
{
|
||||||
Code = input.A.Code!,
|
Code = input.A.Code!,
|
||||||
AFN = input.AFN_FC.AFN,
|
AFN = input.AFN_FC.AFN,
|
||||||
@ -63,7 +63,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AFN_0CH
|
|||||||
DensityUnit = DensityUnit.Second,
|
DensityUnit = DensityUnit.Second,
|
||||||
TimeDensity = 0
|
TimeDensity = 0
|
||||||
};
|
};
|
||||||
await _dataStorage.SaveDataToIotDbAsync<decimal>(unitDataAnalysis);
|
await _dataStorage.SaveDataToIotDbAsync<decimal?>(unitDataAnalysis);
|
||||||
result?.Invoke(unitDataAnalysis);
|
result?.Invoke(unitDataAnalysis);
|
||||||
return await Task.FromResult(true);
|
return await Task.FromResult(true);
|
||||||
}
|
}
|
||||||
@ -110,10 +110,12 @@ namespace JiShe.CollectBus.Protocol.T37612012.AFN_0CH
|
|||||||
}
|
}
|
||||||
return values;
|
return values;
|
||||||
}
|
}
|
||||||
public AnalysisBaseDto<decimal> GenerateFinalResult(List<string> data,string dataType, string filedDesc = "")
|
public AnalysisBaseDto<decimal?> GenerateFinalResult(List<string> data,string dataType, string filedDesc = "")
|
||||||
{
|
{
|
||||||
AnalysisBaseDto<decimal> dto = new AnalysisBaseDto<decimal>();
|
AnalysisBaseDto<decimal?> dto = new AnalysisBaseDto<decimal?>
|
||||||
|
{
|
||||||
|
DeviceType = MeterTypeEnum.Ammeter
|
||||||
|
};
|
||||||
var errorCodeInfo = data[2].CheckErrorCode();
|
var errorCodeInfo = data[2].CheckErrorCode();
|
||||||
if (errorCodeInfo != null)
|
if (errorCodeInfo != null)
|
||||||
{
|
{
|
||||||
@ -133,7 +135,6 @@ namespace JiShe.CollectBus.Protocol.T37612012.AFN_0CH
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
string timeSpan = $"{DateTime.Now.Year}-{data[3].Substring(0, 2)}-{data[3].Substring(2, 2)} {data[3].Substring(4, 2)}:{data[3].Substring(6, 2)}:00";
|
string timeSpan = $"{DateTime.Now.Year}-{data[3].Substring(0, 2)}-{data[3].Substring(2, 2)} {data[3].Substring(4, 2)}:{data[3].Substring(6, 2)}:00";
|
||||||
|
|
||||||
//TODO:时间标
|
//TODO:时间标
|
||||||
if (!DateTime.TryParse(timeSpan, out DateTime dataTime))
|
if (!DateTime.TryParse(timeSpan, out DateTime dataTime))
|
||||||
dto.ValidData = false;
|
dto.ValidData = false;
|
||||||
|
|||||||
@ -6,6 +6,7 @@ using JiShe.CollectBus.Protocol.Dto;
|
|||||||
using JiShe.CollectBus.Protocol.Interfaces;
|
using JiShe.CollectBus.Protocol.Interfaces;
|
||||||
using JiShe.CollectBus.Protocol3761;
|
using JiShe.CollectBus.Protocol3761;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
|
using YamlDotNet.Core.Tokens;
|
||||||
|
|
||||||
namespace JiShe.CollectBus.Protocol.T37612012.AFN_0CH
|
namespace JiShe.CollectBus.Protocol.T37612012.AFN_0CH
|
||||||
{
|
{
|
||||||
@ -34,8 +35,8 @@ namespace JiShe.CollectBus.Protocol.T37612012.AFN_0CH
|
|||||||
ArgumentNullException.ThrowIfNull(input.AFN_FC.AFN);
|
ArgumentNullException.ThrowIfNull(input.AFN_FC.AFN);
|
||||||
ArgumentNullException.ThrowIfNull(input.DT.Fn);
|
ArgumentNullException.ThrowIfNull(input.DT.Fn);
|
||||||
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
||||||
AnalysisBaseDto<decimal> data = GenerateFinalResult(input.UnitData.HexMessageList, dataType);
|
AnalysisBaseDto<decimal?> data = GenerateFinalResult(input.UnitData.HexMessageList, dataType);
|
||||||
UnitDataAnalysis<AnalysisBaseDto<decimal>> dto = new UnitDataAnalysis<AnalysisBaseDto<decimal>>
|
UnitDataAnalysis<AnalysisBaseDto<decimal?>> dto = new UnitDataAnalysis<AnalysisBaseDto<decimal?>>
|
||||||
{
|
{
|
||||||
Code = input.A.Code!,
|
Code = input.A.Code!,
|
||||||
AFN = input.AFN_FC.AFN,
|
AFN = input.AFN_FC.AFN,
|
||||||
@ -58,10 +59,12 @@ namespace JiShe.CollectBus.Protocol.T37612012.AFN_0CH
|
|||||||
}
|
}
|
||||||
return await Task.FromResult(false);
|
return await Task.FromResult(false);
|
||||||
}
|
}
|
||||||
public AnalysisBaseDto<decimal> GenerateFinalResult(List<string> hexMessageList,string dataType)
|
public AnalysisBaseDto<decimal?> GenerateFinalResult(List<string> hexMessageList,string dataType)
|
||||||
{
|
{
|
||||||
AnalysisBaseDto<decimal> dto = new AnalysisBaseDto<decimal>();
|
AnalysisBaseDto<decimal?> dto = new AnalysisBaseDto<decimal?>
|
||||||
decimal value = 0;
|
{
|
||||||
|
DeviceType = MeterTypeEnum.WaterMeter
|
||||||
|
};
|
||||||
var arr = hexMessageList.GetRange(11, 4);
|
var arr = hexMessageList.GetRange(11, 4);
|
||||||
var errorCodeInfo = arr.CheckErrorCode();
|
var errorCodeInfo = arr.CheckErrorCode();
|
||||||
if (errorCodeInfo != null)
|
if (errorCodeInfo != null)
|
||||||
@ -70,9 +73,10 @@ namespace JiShe.CollectBus.Protocol.T37612012.AFN_0CH
|
|||||||
dto.ErrorCodeMsg = errorCodeInfo.Item2;
|
dto.ErrorCodeMsg = errorCodeInfo.Item2;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
decimal.TryParse($"{arr[11]}{arr[12]}{arr[13]}.{arr[14]}", out value);
|
{
|
||||||
|
if (decimal.TryParse($"{arr[11]}{arr[12]}{arr[13]}.{arr[14]}", out decimal value))
|
||||||
dto.DataValue = value;
|
dto.DataValue = value;
|
||||||
|
}
|
||||||
dto.DataType = dataType;
|
dto.DataType = dataType;
|
||||||
dto.FiledDesc = "水示值";
|
dto.FiledDesc = "水示值";
|
||||||
dto.FiledName = dto.DataType.GetDataFieldByGatherDataType() ?? string.Empty;
|
dto.FiledName = dto.DataType.GetDataFieldByGatherDataType() ?? string.Empty;
|
||||||
|
|||||||
@ -1,11 +1,14 @@
|
|||||||
using JiShe.CollectBus.Common.Enums;
|
using JiShe.CollectBus.Common.Enums;
|
||||||
using JiShe.CollectBus.Common.Extensions;
|
using JiShe.CollectBus.Common.Extensions;
|
||||||
|
using JiShe.CollectBus.Common.Helpers;
|
||||||
using JiShe.CollectBus.Protocol.Contracts.Protocol.Dto;
|
using JiShe.CollectBus.Protocol.Contracts.Protocol.Dto;
|
||||||
using JiShe.CollectBus.Protocol.Dto;
|
using JiShe.CollectBus.Protocol.Dto;
|
||||||
using JiShe.CollectBus.Protocol.Interfaces;
|
using JiShe.CollectBus.Protocol.Interfaces;
|
||||||
using JiShe.CollectBus.Protocol.T37612012.Appendix;
|
using JiShe.CollectBus.Protocol.T37612012.Appendix;
|
||||||
using JiShe.CollectBus.Protocol3761;
|
using JiShe.CollectBus.Protocol3761;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
|
using Newtonsoft.Json.Linq;
|
||||||
|
using YamlDotNet.Core.Tokens;
|
||||||
|
|
||||||
namespace JiShe.CollectBus.Protocol.T37612012.AFN_0CH
|
namespace JiShe.CollectBus.Protocol.T37612012.AFN_0CH
|
||||||
{
|
{
|
||||||
@ -32,13 +35,15 @@ namespace JiShe.CollectBus.Protocol.T37612012.AFN_0CH
|
|||||||
ArgumentNullException.ThrowIfNull(input);
|
ArgumentNullException.ThrowIfNull(input);
|
||||||
ArgumentNullException.ThrowIfNull(input.UnitData?.HexMessageList);
|
ArgumentNullException.ThrowIfNull(input.UnitData?.HexMessageList);
|
||||||
List<string> remarks = new List<string>() { "当前总有功功率", "当前A相有功功率", "当前B相有功功率", "当前C相有功功率", "当前总无功功率", "当前A相无功功率", "当前B相无功功率", "当前C相无功功率", "当前总功率因数", "当前A相功率因数", "当前B相功率因数", "当前C相功率因数", "当前A相电压", "当前B相电压", "当前C相电压", "当前A相电流", "当前C相电流", "当前 C相电流", "当前零序电流", "当前总视在功率", "当前A相视在功率", "当前B相视在功率", "当前C相视在功率" };
|
List<string> remarks = new List<string>() { "当前总有功功率", "当前A相有功功率", "当前B相有功功率", "当前C相有功功率", "当前总无功功率", "当前A相无功功率", "当前B相无功功率", "当前C相无功功率", "当前总功率因数", "当前A相功率因数", "当前B相功率因数", "当前C相功率因数", "当前A相电压", "当前B相电压", "当前C相电压", "当前A相电流", "当前C相电流", "当前 C相电流", "当前零序电流", "当前总视在功率", "当前A相视在功率", "当前B相视在功率", "当前C相视在功率" };
|
||||||
List<AnalysisBaseDto<decimal>> list = new List<AnalysisBaseDto<decimal>>();
|
List<AnalysisBaseDto<decimal?>> list = new List<AnalysisBaseDto<decimal?>>();
|
||||||
List<string> data = await AnalysisDataUnitAsync(input.UnitData.HexMessageList);
|
List<string> data = await AnalysisDataUnitAsync(input.UnitData.HexMessageList);
|
||||||
|
|
||||||
for (int i = 1; i < data.Count; i++)
|
for (int i = 1; i < data.Count; i++)
|
||||||
{
|
{
|
||||||
AnalysisBaseDto<decimal> dto = new AnalysisBaseDto<decimal>();
|
AnalysisBaseDto<decimal?> dto = new AnalysisBaseDto<decimal?>
|
||||||
decimal value = 0;
|
{
|
||||||
|
DeviceType = MeterTypeEnum.Ammeter
|
||||||
|
};
|
||||||
var errorCodeInfo = data[i].CheckErrorCode();
|
var errorCodeInfo = data[i].CheckErrorCode();
|
||||||
if (errorCodeInfo != null)
|
if (errorCodeInfo != null)
|
||||||
{
|
{
|
||||||
@ -46,15 +51,18 @@ namespace JiShe.CollectBus.Protocol.T37612012.AFN_0CH
|
|||||||
dto.ErrorCodeMsg = errorCodeInfo.Item2;
|
dto.ErrorCodeMsg = errorCodeInfo.Item2;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
decimal.TryParse(data[i], out value);
|
{
|
||||||
|
if(decimal.TryParse(data[i], out decimal value))
|
||||||
dto.DataValue = value;
|
dto.DataValue = value;
|
||||||
|
}
|
||||||
|
|
||||||
dto.DataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}_{DataType[i-1]}";
|
dto.DataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}_{DataType[i-1]}";
|
||||||
dto.FiledName = DataType[i - 1];
|
dto.FiledName = DataType[i - 1].GetDataFieldByGatherDataType() ?? string.Empty;
|
||||||
dto.TimeSpan = Convert.ToDateTime($"{data[0].Substring(0, 4)}-{data[0].Substring(4, 2)}-{data[0].Substring(6, 2)} {data[0].Substring(8, 2)}:{data[0].Substring(10, 2)}:00");
|
dto.TimeSpan = Convert.ToDateTime($"{data[0].Substring(0, 4)}-{data[0].Substring(4, 2)}-{data[0].Substring(6, 2)} {data[0].Substring(8, 2)}:{data[0].Substring(10, 2)}:00");
|
||||||
dto.FiledDesc = remarks[i - 1];
|
dto.FiledDesc = remarks[i - 1];
|
||||||
list.Add(dto);
|
list.Add(dto);
|
||||||
}
|
}
|
||||||
UnitDataAnalysis<List<AnalysisBaseDto<decimal>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal>>>
|
UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>>
|
||||||
{
|
{
|
||||||
Code = input.A.Code!,
|
Code = input.A.Code!,
|
||||||
AFN = input.AFN_FC.AFN,
|
AFN = input.AFN_FC.AFN,
|
||||||
|
|||||||
@ -6,6 +6,8 @@ using JiShe.CollectBus.Protocol.Interfaces;
|
|||||||
using JiShe.CollectBus.Protocol.T37612012.Appendix;
|
using JiShe.CollectBus.Protocol.T37612012.Appendix;
|
||||||
using JiShe.CollectBus.Protocol3761;
|
using JiShe.CollectBus.Protocol3761;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
|
using static System.Runtime.InteropServices.JavaScript.JSType;
|
||||||
|
using System.Diagnostics.Metrics;
|
||||||
|
|
||||||
namespace JiShe.CollectBus.Protocol.T37612012.AFN_0CH
|
namespace JiShe.CollectBus.Protocol.T37612012.AFN_0CH
|
||||||
{
|
{
|
||||||
@ -71,7 +73,8 @@ namespace JiShe.CollectBus.Protocol.T37612012.AFN_0CH
|
|||||||
{
|
{
|
||||||
await _analysisStrategyContext.ExecuteAsync<List<string>>(nameof(Appendix_A1), arr, (value) =>
|
await _analysisStrategyContext.ExecuteAsync<List<string>>(nameof(Appendix_A1), arr, (value) =>
|
||||||
{
|
{
|
||||||
dto.DataValue = value;
|
var data = (Tuple<string, string>)value;
|
||||||
|
dto.DataValue = $"{data.Item1} {data.Item2}";
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
dto.DataType = dataType;
|
dto.DataType = dataType;
|
||||||
|
|||||||
@ -1,11 +1,13 @@
|
|||||||
using JiShe.CollectBus.Common.Enums;
|
using JiShe.CollectBus.Common.Enums;
|
||||||
using JiShe.CollectBus.Common.Extensions;
|
using JiShe.CollectBus.Common.Extensions;
|
||||||
|
using JiShe.CollectBus.Common.Helpers;
|
||||||
using JiShe.CollectBus.Protocol.Contracts.Protocol.Dto;
|
using JiShe.CollectBus.Protocol.Contracts.Protocol.Dto;
|
||||||
using JiShe.CollectBus.Protocol.Dto;
|
using JiShe.CollectBus.Protocol.Dto;
|
||||||
using JiShe.CollectBus.Protocol.Interfaces;
|
using JiShe.CollectBus.Protocol.Interfaces;
|
||||||
using JiShe.CollectBus.Protocol.T37612012.Appendix;
|
using JiShe.CollectBus.Protocol.T37612012.Appendix;
|
||||||
using JiShe.CollectBus.Protocol3761;
|
using JiShe.CollectBus.Protocol3761;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
|
using YamlDotNet.Core.Tokens;
|
||||||
|
|
||||||
namespace JiShe.CollectBus.Protocol.T37612012.AFN_0CH
|
namespace JiShe.CollectBus.Protocol.T37612012.AFN_0CH
|
||||||
{
|
{
|
||||||
@ -33,11 +35,13 @@ namespace JiShe.CollectBus.Protocol.T37612012.AFN_0CH
|
|||||||
|
|
||||||
List<string> data = await AnalysisDataUnitAsync(input.UnitData?.HexMessageList!);
|
List<string> data = await AnalysisDataUnitAsync(input.UnitData?.HexMessageList!);
|
||||||
List<string> remarks = new List<string>() { "Uab/Ua 相位角", "Ub 相位角", "Ucb/Uc 相位角", "Ia 相位角", "Ib 相位角", "Ic 相位角" };
|
List<string> remarks = new List<string>() { "Uab/Ua 相位角", "Ub 相位角", "Ucb/Uc 相位角", "Ia 相位角", "Ib 相位角", "Ic 相位角" };
|
||||||
List<AnalysisBaseDto<decimal>> list = new List<AnalysisBaseDto<decimal>>();
|
List<AnalysisBaseDto<decimal?>> list = new List<AnalysisBaseDto<decimal?>>();
|
||||||
for (int i = 0; i < data.Count; i++)
|
for (int i = 0; i < data.Count; i++)
|
||||||
{
|
{
|
||||||
AnalysisBaseDto<decimal> dto = new AnalysisBaseDto<decimal>();
|
AnalysisBaseDto<decimal?> dto = new AnalysisBaseDto<decimal?>
|
||||||
decimal value = 0;
|
{
|
||||||
|
DeviceType = MeterTypeEnum.Ammeter
|
||||||
|
};
|
||||||
var errorCodeInfo = data[i].CheckErrorCode();
|
var errorCodeInfo = data[i].CheckErrorCode();
|
||||||
if (errorCodeInfo != null)
|
if (errorCodeInfo != null)
|
||||||
{
|
{
|
||||||
@ -45,15 +49,16 @@ namespace JiShe.CollectBus.Protocol.T37612012.AFN_0CH
|
|||||||
dto.ErrorCodeMsg = errorCodeInfo.Item2;
|
dto.ErrorCodeMsg = errorCodeInfo.Item2;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
decimal.TryParse(data[i], out value);
|
{
|
||||||
|
if(decimal.TryParse(data[i], out decimal value))
|
||||||
dto.DataValue = value;
|
dto.DataValue = value;
|
||||||
|
}
|
||||||
dto.DataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}_{DataType[i]}";
|
dto.DataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}_{DataType[i]}";
|
||||||
dto.FiledName = DataType[i];
|
dto.FiledName = dto.DataType.GetDataFieldByGatherDataType() ?? string.Empty;
|
||||||
dto.FiledDesc= remarks[i];
|
dto.FiledDesc= remarks[i];
|
||||||
list.Add(dto);
|
list.Add(dto);
|
||||||
}
|
}
|
||||||
UnitDataAnalysis<List<AnalysisBaseDto<decimal>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal>>>
|
UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>>
|
||||||
{
|
{
|
||||||
Code = input.A.Code!,
|
Code = input.A.Code!,
|
||||||
AFN = input.AFN_FC.AFN,
|
AFN = input.AFN_FC.AFN,
|
||||||
|
|||||||
@ -38,7 +38,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
int density = Convert.ToInt32(Convert.ToInt32(datas[1]).GetEnumDescription(typeof(DensityEnums)));
|
int density = Convert.ToInt32(Convert.ToInt32(datas[1]).GetEnumDescription(typeof(DensityEnums)));
|
||||||
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
||||||
|
|
||||||
List<AnalysisBaseDto<decimal>> data = datas.GenerateFinalResultTd_c(3, density, dataType, "反向无功总电能量");
|
List<AnalysisBaseDto<decimal?>> data = datas.GenerateFinalResultTd_c(3, density, dataType, "反向无功总电能量");
|
||||||
|
|
||||||
if (data.Count > 0)
|
if (data.Count > 0)
|
||||||
{
|
{
|
||||||
@ -56,7 +56,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
UnitDataAnalysis<List<AnalysisBaseDto<decimal>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal>>>
|
UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>>
|
||||||
{
|
{
|
||||||
Code = input.A.Code!,
|
Code = input.A.Code!,
|
||||||
AFN = input.AFN_FC.AFN,
|
AFN = input.AFN_FC.AFN,
|
||||||
@ -71,7 +71,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
DensityUnit = DensityUnit.Minute,
|
DensityUnit = DensityUnit.Minute,
|
||||||
ReceivedTime = input.ReceivedTime
|
ReceivedTime = input.ReceivedTime
|
||||||
};
|
};
|
||||||
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal>(unitDataAnalysis);
|
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal?>(unitDataAnalysis);
|
||||||
result?.Invoke(unitDataAnalysis);
|
result?.Invoke(unitDataAnalysis);
|
||||||
return await Task.FromResult(true);
|
return await Task.FromResult(true);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -37,7 +37,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
int density = Convert.ToInt32(Convert.ToInt32(datas[1]).GetEnumDescription(typeof(DensityEnums)));
|
int density = Convert.ToInt32(Convert.ToInt32(datas[1]).GetEnumDescription(typeof(DensityEnums)));
|
||||||
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
||||||
|
|
||||||
List<AnalysisBaseDto<decimal>> data = datas.GenerateFinalResultTd_c(3, density, dataType, "正向有功总电能示值");
|
List<AnalysisBaseDto<decimal?>> data = datas.GenerateFinalResultTd_c(3, density, dataType, "正向有功总电能示值");
|
||||||
if (data.Count > 0)
|
if (data.Count > 0)
|
||||||
{
|
{
|
||||||
// 查询电表信息
|
// 查询电表信息
|
||||||
@ -53,7 +53,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
UnitDataAnalysis<List<AnalysisBaseDto<decimal>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal>>>
|
UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>>
|
||||||
{
|
{
|
||||||
Code = input.A.Code!,
|
Code = input.A.Code!,
|
||||||
AFN = input.AFN_FC.AFN,
|
AFN = input.AFN_FC.AFN,
|
||||||
@ -68,7 +68,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
DensityUnit = DensityUnit.Minute,
|
DensityUnit = DensityUnit.Minute,
|
||||||
ReceivedTime = input.ReceivedTime
|
ReceivedTime = input.ReceivedTime
|
||||||
};
|
};
|
||||||
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal>(unitDataAnalysis);
|
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal?>(unitDataAnalysis);
|
||||||
result?.Invoke(unitDataAnalysis);
|
result?.Invoke(unitDataAnalysis);
|
||||||
return await Task.FromResult(true);
|
return await Task.FromResult(true);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -38,7 +38,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
|
|
||||||
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
||||||
|
|
||||||
List<AnalysisBaseDto<decimal>> data = datas.GenerateFinalResultTd_c(3, density, dataType, "正向无功总电能示值");
|
List<AnalysisBaseDto<decimal?>> data = datas.GenerateFinalResultTd_c(3, density, dataType, "正向无功总电能示值");
|
||||||
|
|
||||||
if (data.Count > 0)
|
if (data.Count > 0)
|
||||||
{
|
{
|
||||||
@ -55,7 +55,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
UnitDataAnalysis<List<AnalysisBaseDto<decimal>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal>>>
|
UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>>
|
||||||
{
|
{
|
||||||
Code = input.A.Code!,
|
Code = input.A.Code!,
|
||||||
AFN = input.AFN_FC.AFN,
|
AFN = input.AFN_FC.AFN,
|
||||||
@ -70,7 +70,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
DensityUnit = DensityUnit.Minute,
|
DensityUnit = DensityUnit.Minute,
|
||||||
ReceivedTime = input.ReceivedTime
|
ReceivedTime = input.ReceivedTime
|
||||||
};
|
};
|
||||||
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal>(unitDataAnalysis);
|
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal?>(unitDataAnalysis);
|
||||||
result?.Invoke(unitDataAnalysis);
|
result?.Invoke(unitDataAnalysis);
|
||||||
return await Task.FromResult(true);
|
return await Task.FromResult(true);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -38,7 +38,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
|
|
||||||
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
||||||
|
|
||||||
List<AnalysisBaseDto<decimal>> data = datas.GenerateFinalResultTd_c(3, density, dataType, "反向有功总电能示值");
|
List<AnalysisBaseDto<decimal?>> data = datas.GenerateFinalResultTd_c(3, density, dataType, "反向有功总电能示值");
|
||||||
|
|
||||||
if (data.Count > 0)
|
if (data.Count > 0)
|
||||||
{
|
{
|
||||||
@ -55,7 +55,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
UnitDataAnalysis<List<AnalysisBaseDto<decimal>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal>>>
|
UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>>
|
||||||
{
|
{
|
||||||
Code = input.A.Code!,
|
Code = input.A.Code!,
|
||||||
AFN = input.AFN_FC.AFN,
|
AFN = input.AFN_FC.AFN,
|
||||||
@ -70,7 +70,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
DensityUnit = DensityUnit.Minute,
|
DensityUnit = DensityUnit.Minute,
|
||||||
ReceivedTime = input.ReceivedTime
|
ReceivedTime = input.ReceivedTime
|
||||||
};
|
};
|
||||||
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal>(unitDataAnalysis);
|
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal?>(unitDataAnalysis);
|
||||||
result?.Invoke(unitDataAnalysis);
|
result?.Invoke(unitDataAnalysis);
|
||||||
return await Task.FromResult(true);
|
return await Task.FromResult(true);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -37,7 +37,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
int density = Convert.ToInt32(Convert.ToInt32(datas[1]).GetEnumDescription(typeof(DensityEnums)));
|
int density = Convert.ToInt32(Convert.ToInt32(datas[1]).GetEnumDescription(typeof(DensityEnums)));
|
||||||
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
||||||
|
|
||||||
List<AnalysisBaseDto<decimal>> data = datas.GenerateFinalResultTd_c(3, density, dataType, "反向无功总电能示值");
|
List<AnalysisBaseDto<decimal?>> data = datas.GenerateFinalResultTd_c(3, density, dataType, "反向无功总电能示值");
|
||||||
|
|
||||||
if (data.Count > 0)
|
if (data.Count > 0)
|
||||||
{
|
{
|
||||||
@ -54,7 +54,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
UnitDataAnalysis<List<AnalysisBaseDto<decimal>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal>>>
|
UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>>
|
||||||
{
|
{
|
||||||
Code = input.A.Code!,
|
Code = input.A.Code!,
|
||||||
AFN = input.AFN_FC.AFN,
|
AFN = input.AFN_FC.AFN,
|
||||||
@ -69,7 +69,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
DensityUnit = DensityUnit.Minute,
|
DensityUnit = DensityUnit.Minute,
|
||||||
ReceivedTime = input.ReceivedTime
|
ReceivedTime = input.ReceivedTime
|
||||||
};
|
};
|
||||||
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal>(unitDataAnalysis);
|
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal?>(unitDataAnalysis);
|
||||||
result?.Invoke(unitDataAnalysis);
|
result?.Invoke(unitDataAnalysis);
|
||||||
return await Task.FromResult(true);
|
return await Task.FromResult(true);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -37,7 +37,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
int density = Convert.ToInt32(Convert.ToInt32(datas[1]).GetEnumDescription(typeof(DensityEnums)));
|
int density = Convert.ToInt32(Convert.ToInt32(datas[1]).GetEnumDescription(typeof(DensityEnums)));
|
||||||
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
||||||
|
|
||||||
List<AnalysisBaseDto<decimal>> data = datas.GenerateFinalResultTd_c(3, density, dataType, "功率因数");
|
List<AnalysisBaseDto<decimal?>> data = datas.GenerateFinalResultTd_c(3, density, dataType, "功率因数");
|
||||||
|
|
||||||
if (data.Count > 0)
|
if (data.Count > 0)
|
||||||
{
|
{
|
||||||
@ -54,7 +54,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
UnitDataAnalysis<List<AnalysisBaseDto<decimal>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal>>>
|
UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>>
|
||||||
{
|
{
|
||||||
Code = input.A.Code!,
|
Code = input.A.Code!,
|
||||||
AFN = input.AFN_FC.AFN,
|
AFN = input.AFN_FC.AFN,
|
||||||
@ -69,7 +69,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
DensityUnit = DensityUnit.Minute,
|
DensityUnit = DensityUnit.Minute,
|
||||||
ReceivedTime = input.ReceivedTime
|
ReceivedTime = input.ReceivedTime
|
||||||
};
|
};
|
||||||
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal>(unitDataAnalysis);
|
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal?>(unitDataAnalysis);
|
||||||
result?.Invoke(unitDataAnalysis);
|
result?.Invoke(unitDataAnalysis);
|
||||||
return await Task.FromResult(true);
|
return await Task.FromResult(true);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -37,7 +37,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
int density = Convert.ToInt32(Convert.ToInt32(datas[1]).GetEnumDescription(typeof(DensityEnums)));
|
int density = Convert.ToInt32(Convert.ToInt32(datas[1]).GetEnumDescription(typeof(DensityEnums)));
|
||||||
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
||||||
|
|
||||||
List<AnalysisBaseDto<decimal>> data = datas.GenerateFinalResultTd_c(3, density, dataType, "A相功率因数");
|
List<AnalysisBaseDto<decimal?>> data = datas.GenerateFinalResultTd_c(3, density, dataType, "A相功率因数");
|
||||||
|
|
||||||
if (data.Count > 0)
|
if (data.Count > 0)
|
||||||
{
|
{
|
||||||
@ -54,7 +54,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
UnitDataAnalysis<List<AnalysisBaseDto<decimal>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal>>>
|
UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>>
|
||||||
{
|
{
|
||||||
Code = input.A.Code!,
|
Code = input.A.Code!,
|
||||||
AFN = input.AFN_FC.AFN,
|
AFN = input.AFN_FC.AFN,
|
||||||
@ -69,7 +69,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
DensityUnit = DensityUnit.Minute,
|
DensityUnit = DensityUnit.Minute,
|
||||||
ReceivedTime = input.ReceivedTime
|
ReceivedTime = input.ReceivedTime
|
||||||
};
|
};
|
||||||
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal>(unitDataAnalysis);
|
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal?>(unitDataAnalysis);
|
||||||
result?.Invoke(unitDataAnalysis);
|
result?.Invoke(unitDataAnalysis);
|
||||||
return await Task.FromResult(true);
|
return await Task.FromResult(true);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -37,7 +37,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
int density = Convert.ToInt32(Convert.ToInt32(datas[1]).GetEnumDescription(typeof(DensityEnums)));
|
int density = Convert.ToInt32(Convert.ToInt32(datas[1]).GetEnumDescription(typeof(DensityEnums)));
|
||||||
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
||||||
|
|
||||||
List<AnalysisBaseDto<decimal>> data = datas.GenerateFinalResultTd_c(3, density, dataType, "B相功率因数");
|
List<AnalysisBaseDto<decimal?>> data = datas.GenerateFinalResultTd_c(3, density, dataType, "B相功率因数");
|
||||||
if (data.Count > 0)
|
if (data.Count > 0)
|
||||||
{
|
{
|
||||||
// 查询电表信息
|
// 查询电表信息
|
||||||
@ -53,7 +53,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
UnitDataAnalysis<List<AnalysisBaseDto<decimal>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal>>>
|
UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>>
|
||||||
{
|
{
|
||||||
Code = input.A.Code!,
|
Code = input.A.Code!,
|
||||||
AFN = input.AFN_FC.AFN,
|
AFN = input.AFN_FC.AFN,
|
||||||
@ -68,7 +68,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
DensityUnit = DensityUnit.Minute,
|
DensityUnit = DensityUnit.Minute,
|
||||||
ReceivedTime = input.ReceivedTime
|
ReceivedTime = input.ReceivedTime
|
||||||
};
|
};
|
||||||
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal>(unitDataAnalysis);
|
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal?>(unitDataAnalysis);
|
||||||
result?.Invoke(unitDataAnalysis);
|
result?.Invoke(unitDataAnalysis);
|
||||||
return await Task.FromResult(true);
|
return await Task.FromResult(true);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -37,7 +37,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
int density = Convert.ToInt32(Convert.ToInt32(datas[1]).GetEnumDescription(typeof(DensityEnums)));
|
int density = Convert.ToInt32(Convert.ToInt32(datas[1]).GetEnumDescription(typeof(DensityEnums)));
|
||||||
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
||||||
|
|
||||||
List<AnalysisBaseDto<decimal>> data = datas.GenerateFinalResultTd_c(3, density, dataType, "C相功率因数");
|
List<AnalysisBaseDto<decimal?>> data = datas.GenerateFinalResultTd_c(3, density, dataType, "C相功率因数");
|
||||||
|
|
||||||
if (data.Count > 0)
|
if (data.Count > 0)
|
||||||
{
|
{
|
||||||
@ -54,7 +54,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
UnitDataAnalysis<List<AnalysisBaseDto<decimal>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal>>>
|
UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>>
|
||||||
{
|
{
|
||||||
Code = input.A.Code!,
|
Code = input.A.Code!,
|
||||||
AFN = input.AFN_FC.AFN,
|
AFN = input.AFN_FC.AFN,
|
||||||
@ -69,7 +69,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
DensityUnit = DensityUnit.Minute,
|
DensityUnit = DensityUnit.Minute,
|
||||||
ReceivedTime = input.ReceivedTime
|
ReceivedTime = input.ReceivedTime
|
||||||
};
|
};
|
||||||
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal>(unitDataAnalysis);
|
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal?>(unitDataAnalysis);
|
||||||
result?.Invoke(unitDataAnalysis);
|
result?.Invoke(unitDataAnalysis);
|
||||||
return await Task.FromResult(true);
|
return await Task.FromResult(true);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -8,6 +8,7 @@ using JiShe.CollectBus.Protocol.Interfaces;
|
|||||||
using JiShe.CollectBus.Protocol.T37612012.Appendix;
|
using JiShe.CollectBus.Protocol.T37612012.Appendix;
|
||||||
using JiShe.CollectBus.Protocol3761;
|
using JiShe.CollectBus.Protocol3761;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
|
using YamlDotNet.Core.Tokens;
|
||||||
|
|
||||||
namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
||||||
{
|
{
|
||||||
@ -35,7 +36,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
|
|
||||||
List<string> datas = await AnalysisDataUnitAsync(input.UnitData.HexMessageList);
|
List<string> datas = await AnalysisDataUnitAsync(input.UnitData.HexMessageList);
|
||||||
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
||||||
List<AnalysisBaseDto<decimal>> data = GenerateFinalResult(datas,3, dataType, "抄表日冻结电能表正向有功最大需量及发生时间");
|
List<AnalysisBaseDto<decimal?>> data = GenerateFinalResult(datas,3, dataType, "抄表日冻结电能表正向有功最大需量及发生时间");
|
||||||
|
|
||||||
if (data.Count > 0)
|
if (data.Count > 0)
|
||||||
{
|
{
|
||||||
@ -52,7 +53,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
UnitDataAnalysis<List<AnalysisBaseDto<decimal>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal>>>
|
UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>>
|
||||||
{
|
{
|
||||||
Code = input.A.Code!,
|
Code = input.A.Code!,
|
||||||
AFN = input.AFN_FC.AFN,
|
AFN = input.AFN_FC.AFN,
|
||||||
@ -67,7 +68,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
DensityUnit = DensityUnit.Day,
|
DensityUnit = DensityUnit.Day,
|
||||||
ReceivedTime = input.ReceivedTime
|
ReceivedTime = input.ReceivedTime
|
||||||
};
|
};
|
||||||
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal>(unitDataAnalysis);
|
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal?>(unitDataAnalysis);
|
||||||
result?.Invoke(unitDataAnalysis);
|
result?.Invoke(unitDataAnalysis);
|
||||||
return await Task.FromResult(true);
|
return await Task.FromResult(true);
|
||||||
}
|
}
|
||||||
@ -86,18 +87,18 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
int ratingCount = hexMessageList.GetRatingCount(12, 1);//费率数 M(1≤M≤12)
|
int ratingCount = hexMessageList.GetRatingCount(12, 1);//费率数 M(1≤M≤12)
|
||||||
values.Add(ratingCount.ToString());
|
values.Add(ratingCount.ToString());
|
||||||
int handlerNum = 13;
|
int handlerNum = 13;
|
||||||
values.AddRange(await GetDataAsync<decimal>(hexMessageList.GetRange(handlerNum, 3 * (ratingCount + 1)), ratingCount, 3, nameof(Appendix_A23)));//正向有功总最大需量
|
values.AddRange(await GetDataAsync(hexMessageList.GetRange(handlerNum, 3 * (ratingCount + 1)), ratingCount, 3, nameof(Appendix_A23)));//正向有功总最大需量
|
||||||
handlerNum += 3 * (ratingCount + 1);//12
|
handlerNum += 3 * (ratingCount + 1);//12
|
||||||
values.AddRange(await GetDataAsync<string>(hexMessageList.GetRange(handlerNum, 4 * (ratingCount + 1)), ratingCount, 4, nameof(Appendix_A17)));//正向有功总最大需量发生时间
|
values.AddRange(await GetDataAsync(hexMessageList.GetRange(handlerNum, 4 * (ratingCount + 1)), ratingCount, 4, nameof(Appendix_A17)));//正向有功总最大需量发生时间
|
||||||
handlerNum += 4 * (ratingCount + 1);//28
|
handlerNum += 4 * (ratingCount + 1);//28
|
||||||
values.AddRange(await GetDataAsync<decimal>(hexMessageList.GetRange(handlerNum, 3 * (ratingCount + 1)), ratingCount, 3, nameof(Appendix_A23)));//正向无功总最大需量
|
values.AddRange(await GetDataAsync(hexMessageList.GetRange(handlerNum, 3 * (ratingCount + 1)), ratingCount, 3, nameof(Appendix_A23)));//正向无功总最大需量
|
||||||
handlerNum += 3 * (ratingCount + 1);//48
|
handlerNum += 3 * (ratingCount + 1);//48
|
||||||
values.AddRange(await GetDataAsync<string>(hexMessageList.GetRange(handlerNum, 4 * (ratingCount + 1)), ratingCount, 4, nameof(Appendix_A17)));//正向无功总最大需量发生时间
|
values.AddRange(await GetDataAsync(hexMessageList.GetRange(handlerNum, 4 * (ratingCount + 1)), ratingCount, 4, nameof(Appendix_A17)));//正向无功总最大需量发生时间
|
||||||
handlerNum += 4 * (ratingCount + 1);
|
handlerNum += 4 * (ratingCount + 1);
|
||||||
return values;
|
return values;
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<List<string>> GetDataAsync<T>(List<string> data, int ratingCount, int len, string appendixName)
|
private async Task<List<string>> GetDataAsync(List<string> data, int ratingCount, int len, string appendixName)
|
||||||
{
|
{
|
||||||
List<string> values = new List<string>();
|
List<string> values = new List<string>();
|
||||||
for (int i = 0; i < ratingCount + 1; i++)
|
for (int i = 0; i < ratingCount + 1; i++)
|
||||||
@ -108,7 +109,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
values.Add(errorCode.Item1);
|
values.Add(errorCode.Item1);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
await _analysisStrategyContext.ExecuteAsync<List<string>>(nameof(Appendix_A5), arr, (value) =>
|
await _analysisStrategyContext.ExecuteAsync<List<string>>(appendixName, arr, (value) =>
|
||||||
{
|
{
|
||||||
values.Add(value.ToString());
|
values.Add(value.ToString());
|
||||||
});
|
});
|
||||||
@ -117,19 +118,18 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
return values;
|
return values;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<AnalysisBaseDto<decimal>> GenerateFinalResult(List<string> data, int index, string dataType, string filedDesc = "")
|
public List<AnalysisBaseDto<decimal?>> GenerateFinalResult(List<string> data, int index, string dataType, string filedDesc = "")
|
||||||
{
|
{
|
||||||
List<AnalysisBaseDto<decimal>> list = new List<AnalysisBaseDto<decimal>>();
|
List<AnalysisBaseDto<decimal?>> list = new List<AnalysisBaseDto<decimal?>>();
|
||||||
int fCount = Convert.ToInt32(data[2]) + 1;
|
int fCount = Convert.ToInt32(data[2]) + 1;
|
||||||
for (int i = 1; i <= 2; i++)
|
for (int i = 1; i <= 2; i++)
|
||||||
{
|
{
|
||||||
AnalysisBaseDto<decimal> meter = new AnalysisBaseDto<decimal>
|
AnalysisBaseDto<decimal?> meter = new AnalysisBaseDto<decimal?>
|
||||||
{
|
{
|
||||||
DeviceType = MeterTypeEnum.Ammeter
|
DeviceType = MeterTypeEnum.Ammeter
|
||||||
};
|
};
|
||||||
int startIndex = i == 1 ? 3 : (3 + i * fCount);
|
int startIndex = i == 1 ? 3 : (3 + i * fCount);
|
||||||
|
|
||||||
decimal value = 0;
|
|
||||||
var errorCode = data[startIndex].CheckErrorCode();
|
var errorCode = data[startIndex].CheckErrorCode();
|
||||||
if (errorCode != null)
|
if (errorCode != null)
|
||||||
{
|
{
|
||||||
@ -137,12 +137,14 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
meter.ErrorCodeMsg = errorCode.Item2;
|
meter.ErrorCodeMsg = errorCode.Item2;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
decimal.TryParse(data[startIndex], out value);
|
{
|
||||||
|
if(decimal.TryParse(data[startIndex], out decimal value))
|
||||||
|
{
|
||||||
meter.DataValue = value;
|
meter.DataValue = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
string timeSpan = $"{DateTime.Now.Year}-{data[startIndex + fCount].Substring(0, 2)}-{data[startIndex + fCount].Substring(2, 2)} {data[startIndex + fCount].Substring(4, 2)}:{data[startIndex + fCount].Substring(6, 2)}:00";
|
string timeSpan = $"{DateTime.Now.Year}-{data[startIndex + fCount].Substring(0, 2)}-{data[startIndex + fCount].Substring(2, 2)} {data[startIndex + fCount].Substring(4, 2)}:{data[startIndex + fCount].Substring(6, 2)}:00";
|
||||||
DateTime readingDate = DateTime.Now;
|
if (DateTime.TryParse(timeSpan, out DateTime readingDate))
|
||||||
if (DateTime.TryParse(timeSpan, out readingDate))
|
|
||||||
{
|
{
|
||||||
meter.TimeSpan = readingDate;
|
meter.TimeSpan = readingDate;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -37,7 +37,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
int density = Convert.ToInt32(Convert.ToInt32(datas[1]).GetEnumDescription(typeof(DensityEnums)));
|
int density = Convert.ToInt32(Convert.ToInt32(datas[1]).GetEnumDescription(typeof(DensityEnums)));
|
||||||
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
||||||
|
|
||||||
List<AnalysisBaseDto<decimal>> data = datas.GenerateFinalResultTd_c(3, density, dataType, "一象限无功电能示值");
|
List<AnalysisBaseDto<decimal?>> data = datas.GenerateFinalResultTd_c(3, density, dataType, "一象限无功电能示值");
|
||||||
if (data.Count > 0)
|
if (data.Count > 0)
|
||||||
{
|
{
|
||||||
// 查询电表信息
|
// 查询电表信息
|
||||||
@ -53,7 +53,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
UnitDataAnalysis<List<AnalysisBaseDto<decimal>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal>>>
|
UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>>
|
||||||
{
|
{
|
||||||
Code = input.A.Code!,
|
Code = input.A.Code!,
|
||||||
AFN = input.AFN_FC.AFN,
|
AFN = input.AFN_FC.AFN,
|
||||||
@ -68,7 +68,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
DensityUnit = DensityUnit.Minute,
|
DensityUnit = DensityUnit.Minute,
|
||||||
ReceivedTime = input.ReceivedTime
|
ReceivedTime = input.ReceivedTime
|
||||||
};
|
};
|
||||||
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal>(unitDataAnalysis);
|
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal?>(unitDataAnalysis);
|
||||||
result?.Invoke(unitDataAnalysis);
|
result?.Invoke(unitDataAnalysis);
|
||||||
return await Task.FromResult(true);
|
return await Task.FromResult(true);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -31,13 +31,14 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
ArgumentNullException.ThrowIfNull(input);
|
ArgumentNullException.ThrowIfNull(input);
|
||||||
|
ArgumentNullException.ThrowIfNull(input.A.Code);
|
||||||
ArgumentNullException.ThrowIfNull(input.UnitData?.HexMessageList);
|
ArgumentNullException.ThrowIfNull(input.UnitData?.HexMessageList);
|
||||||
|
|
||||||
List<string> datas = await AnalysisDataUnitAsync(input.UnitData.HexMessageList);
|
List<string> datas = await AnalysisDataUnitAsync(input.UnitData.HexMessageList);
|
||||||
int density = Convert.ToInt32(Convert.ToInt32(datas[1]).GetEnumDescription(typeof(DensityEnums)));
|
int density = Convert.ToInt32(Convert.ToInt32(datas[1]).GetEnumDescription(typeof(DensityEnums)));
|
||||||
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
||||||
|
|
||||||
List<AnalysisBaseDto<decimal>> data = datas.GenerateFinalResultTd_c(3, density, dataType, "四象限无功电能示值");
|
List<AnalysisBaseDto<decimal?>> data = datas.GenerateFinalResultTd_c(3, density, dataType, "四象限无功电能示值");
|
||||||
if (data.Count > 0)
|
if (data.Count > 0)
|
||||||
{
|
{
|
||||||
// 查询电表信息
|
// 查询电表信息
|
||||||
@ -53,7 +54,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
UnitDataAnalysis<List<AnalysisBaseDto<decimal>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal>>>
|
UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>>
|
||||||
{
|
{
|
||||||
Code = input.A.Code!,
|
Code = input.A.Code!,
|
||||||
AFN = input.AFN_FC.AFN,
|
AFN = input.AFN_FC.AFN,
|
||||||
@ -68,7 +69,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
DensityUnit = DensityUnit.Minute,
|
DensityUnit = DensityUnit.Minute,
|
||||||
ReceivedTime = input.ReceivedTime
|
ReceivedTime = input.ReceivedTime
|
||||||
};
|
};
|
||||||
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal>(unitDataAnalysis);
|
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal?>(unitDataAnalysis);
|
||||||
result?.Invoke(unitDataAnalysis);
|
result?.Invoke(unitDataAnalysis);
|
||||||
return await Task.FromResult(true);
|
return await Task.FromResult(true);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -37,7 +37,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
int density = Convert.ToInt32(Convert.ToInt32(datas[1]).GetEnumDescription(typeof(DensityEnums)));
|
int density = Convert.ToInt32(Convert.ToInt32(datas[1]).GetEnumDescription(typeof(DensityEnums)));
|
||||||
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
||||||
|
|
||||||
List<AnalysisBaseDto<decimal>> data = datas.GenerateFinalResultTd_c(3, density, dataType, "二象限无功电能示值");
|
List<AnalysisBaseDto<decimal?>> data = datas.GenerateFinalResultTd_c(3, density, dataType, "二象限无功电能示值");
|
||||||
if (data.Count > 0)
|
if (data.Count > 0)
|
||||||
{
|
{
|
||||||
// 查询电表信息
|
// 查询电表信息
|
||||||
@ -53,7 +53,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
UnitDataAnalysis<List<AnalysisBaseDto<decimal>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal>>>
|
UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>>
|
||||||
{
|
{
|
||||||
Code = input.A.Code!,
|
Code = input.A.Code!,
|
||||||
AFN = input.AFN_FC.AFN,
|
AFN = input.AFN_FC.AFN,
|
||||||
@ -68,7 +68,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
DensityUnit = DensityUnit.Minute,
|
DensityUnit = DensityUnit.Minute,
|
||||||
ReceivedTime = input.ReceivedTime
|
ReceivedTime = input.ReceivedTime
|
||||||
};
|
};
|
||||||
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal>(unitDataAnalysis);
|
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal?>(unitDataAnalysis);
|
||||||
result?.Invoke(unitDataAnalysis);
|
result?.Invoke(unitDataAnalysis);
|
||||||
return await Task.FromResult(true);
|
return await Task.FromResult(true);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -37,7 +37,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
int density = Convert.ToInt32(Convert.ToInt32(datas[1]).GetEnumDescription(typeof(DensityEnums)));
|
int density = Convert.ToInt32(Convert.ToInt32(datas[1]).GetEnumDescription(typeof(DensityEnums)));
|
||||||
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
||||||
|
|
||||||
List<AnalysisBaseDto<decimal>> data = datas.GenerateFinalResultTd_c(3, density, dataType, "三象限无功电能示值");
|
List<AnalysisBaseDto<decimal?>> data = datas.GenerateFinalResultTd_c(3, density, dataType, "三象限无功电能示值");
|
||||||
|
|
||||||
if (data.Count > 0)
|
if (data.Count > 0)
|
||||||
{
|
{
|
||||||
@ -54,7 +54,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
UnitDataAnalysis<List<AnalysisBaseDto<decimal>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal>>>
|
UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>>
|
||||||
{
|
{
|
||||||
Code = input.A.Code!,
|
Code = input.A.Code!,
|
||||||
AFN = input.AFN_FC.AFN,
|
AFN = input.AFN_FC.AFN,
|
||||||
@ -69,7 +69,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
DensityUnit = DensityUnit.Minute,
|
DensityUnit = DensityUnit.Minute,
|
||||||
ReceivedTime = input.ReceivedTime
|
ReceivedTime = input.ReceivedTime
|
||||||
};
|
};
|
||||||
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal>(unitDataAnalysis);
|
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal?>(unitDataAnalysis);
|
||||||
result?.Invoke(unitDataAnalysis);
|
result?.Invoke(unitDataAnalysis);
|
||||||
return await Task.FromResult(true);
|
return await Task.FromResult(true);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -36,7 +36,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
string timeSpan = $"{datas[0].Substring(0, 4)}-{datas[0].Substring(4, 2)}-{datas[0].Substring(6, 2)} 00:00:00";
|
string timeSpan = $"{datas[0].Substring(0, 4)}-{datas[0].Substring(4, 2)}-{datas[0].Substring(6, 2)} 00:00:00";
|
||||||
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
||||||
|
|
||||||
List<AnalysisBaseDto<decimal>> data = datas.GenerateFinalResultTd_d(3, dataType,timeSpan, "正向有功总电能示值").IsValidData(new List<string>() { "0D_161", "0D_161_1", "0D_161_2", "0D_161_3", "0D_161_4" });
|
List<AnalysisBaseDto<decimal?>> data = datas.GenerateFinalResultTd_d(3, dataType,timeSpan, "正向有功总电能示值").IsValidData(new List<string>() { "0D_161", "0D_161_1", "0D_161_2", "0D_161_3", "0D_161_4" });
|
||||||
|
|
||||||
if (data.Count > 0)
|
if (data.Count > 0)
|
||||||
{
|
{
|
||||||
@ -53,7 +53,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
UnitDataAnalysis<List<AnalysisBaseDto<decimal>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal>>>
|
UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>>
|
||||||
{
|
{
|
||||||
Code = input.A.Code!,
|
Code = input.A.Code!,
|
||||||
AFN = input.AFN_FC.AFN,
|
AFN = input.AFN_FC.AFN,
|
||||||
@ -68,7 +68,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
DensityUnit = DensityUnit.Day,
|
DensityUnit = DensityUnit.Day,
|
||||||
ReceivedTime = input.ReceivedTime
|
ReceivedTime = input.ReceivedTime
|
||||||
};
|
};
|
||||||
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal>(unitDataAnalysis);
|
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal?>(unitDataAnalysis);
|
||||||
result?.Invoke(unitDataAnalysis);
|
result?.Invoke(unitDataAnalysis);
|
||||||
return await Task.FromResult(true);
|
return await Task.FromResult(true);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -36,7 +36,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
string timeSpan = $"{datas[0].Substring(0, 4)}-{datas[0].Substring(4, 2)}-{datas[0].Substring(6, 2)} 00:00:00";
|
string timeSpan = $"{datas[0].Substring(0, 4)}-{datas[0].Substring(4, 2)}-{datas[0].Substring(6, 2)} 00:00:00";
|
||||||
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
||||||
|
|
||||||
List<AnalysisBaseDto<decimal>> data = datas.GenerateFinalResultTd_d(3, dataType, timeSpan, "正向无功(组合无功 1)电能示值").IsValidData(new List<string>() { "0D_162", "0D_162_1", "0D_162_2", "0D_162_3", "0D_162_4" });
|
List<AnalysisBaseDto<decimal?>> data = datas.GenerateFinalResultTd_d(3, dataType, timeSpan, "正向无功(组合无功 1)电能示值").IsValidData(new List<string>() { "0D_162", "0D_162_1", "0D_162_2", "0D_162_3", "0D_162_4" });
|
||||||
if (data.Count > 0)
|
if (data.Count > 0)
|
||||||
{
|
{
|
||||||
// 查询电表信息
|
// 查询电表信息
|
||||||
@ -52,7 +52,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
UnitDataAnalysis<List<AnalysisBaseDto<decimal>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal>>>
|
UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>>
|
||||||
{
|
{
|
||||||
Code = input.A.Code!,
|
Code = input.A.Code!,
|
||||||
AFN = input.AFN_FC.AFN,
|
AFN = input.AFN_FC.AFN,
|
||||||
@ -67,7 +67,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
DensityUnit = DensityUnit.Day,
|
DensityUnit = DensityUnit.Day,
|
||||||
ReceivedTime = input.ReceivedTime
|
ReceivedTime = input.ReceivedTime
|
||||||
};
|
};
|
||||||
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal>(unitDataAnalysis);
|
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal?>(unitDataAnalysis);
|
||||||
result?.Invoke(unitDataAnalysis);
|
result?.Invoke(unitDataAnalysis);
|
||||||
return await Task.FromResult(true);
|
return await Task.FromResult(true);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -36,7 +36,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
string timeSpan = $"{datas[0].Substring(0, 4)}-{datas[0].Substring(4, 2)}-{datas[0].Substring(6, 2)} 00:00:00";
|
string timeSpan = $"{datas[0].Substring(0, 4)}-{datas[0].Substring(4, 2)}-{datas[0].Substring(6, 2)} 00:00:00";
|
||||||
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
||||||
|
|
||||||
List<AnalysisBaseDto<decimal>> data = datas.GenerateFinalResultTd_d(3, dataType, timeSpan, "反向有功总电能示值").IsValidData(new List<string>() { "0D_163", "0D_163_1", "0D_163_2", "0D_163_3", "0D_163_4" });
|
List<AnalysisBaseDto<decimal?>> data = datas.GenerateFinalResultTd_d(3, dataType, timeSpan, "反向有功总电能示值").IsValidData(new List<string>() { "0D_163", "0D_163_1", "0D_163_2", "0D_163_3", "0D_163_4" });
|
||||||
|
|
||||||
if (data.Count > 0)
|
if (data.Count > 0)
|
||||||
{
|
{
|
||||||
@ -53,7 +53,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
UnitDataAnalysis<List<AnalysisBaseDto<decimal>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal>>>
|
UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>>
|
||||||
{
|
{
|
||||||
Code = input.A.Code!,
|
Code = input.A.Code!,
|
||||||
AFN = input.AFN_FC.AFN,
|
AFN = input.AFN_FC.AFN,
|
||||||
@ -68,7 +68,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
DensityUnit = DensityUnit.Day,
|
DensityUnit = DensityUnit.Day,
|
||||||
ReceivedTime = input.ReceivedTime
|
ReceivedTime = input.ReceivedTime
|
||||||
};
|
};
|
||||||
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal>(unitDataAnalysis);
|
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal?>(unitDataAnalysis);
|
||||||
result?.Invoke(unitDataAnalysis);
|
result?.Invoke(unitDataAnalysis);
|
||||||
return await Task.FromResult(true);
|
return await Task.FromResult(true);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -36,7 +36,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
string timeSpan = $"{datas[0].Substring(0, 4)}-{datas[0].Substring(4, 2)}-{datas[0].Substring(6, 2)} 00:00:00";
|
string timeSpan = $"{datas[0].Substring(0, 4)}-{datas[0].Substring(4, 2)}-{datas[0].Substring(6, 2)} 00:00:00";
|
||||||
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
||||||
|
|
||||||
List<AnalysisBaseDto<decimal>> data = datas.GenerateFinalResultTd_d(3, dataType, timeSpan, "日冻结反向无功(组合无功 1)电能示值").IsValidData(new List<string>() { "0D_164", "0D_164_1", "0D_164_2", "0D_164_3", "0D_164_4" });
|
List<AnalysisBaseDto<decimal?>> data = datas.GenerateFinalResultTd_d(3, dataType, timeSpan, "日冻结反向无功(组合无功 1)电能示值").IsValidData(new List<string>() { "0D_164", "0D_164_1", "0D_164_2", "0D_164_3", "0D_164_4" });
|
||||||
if (data.Count > 0)
|
if (data.Count > 0)
|
||||||
{
|
{
|
||||||
// 查询电表信息
|
// 查询电表信息
|
||||||
@ -52,7 +52,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
UnitDataAnalysis<List<AnalysisBaseDto<decimal>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal>>>
|
UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>>
|
||||||
{
|
{
|
||||||
Code = input.A.Code!,
|
Code = input.A.Code!,
|
||||||
AFN = input.AFN_FC.AFN,
|
AFN = input.AFN_FC.AFN,
|
||||||
@ -67,7 +67,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
DensityUnit = DensityUnit.Day,
|
DensityUnit = DensityUnit.Day,
|
||||||
ReceivedTime = input.ReceivedTime
|
ReceivedTime = input.ReceivedTime
|
||||||
};
|
};
|
||||||
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal>(unitDataAnalysis);
|
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal?>(unitDataAnalysis);
|
||||||
result?.Invoke(unitDataAnalysis);
|
result?.Invoke(unitDataAnalysis);
|
||||||
return await Task.FromResult(true);
|
return await Task.FromResult(true);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -36,7 +36,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
string timeSpan = $"{datas[0].Substring(0, 4)}-{datas[0].Substring(4, 2)}-{datas[0].Substring(6, 2)} 00:00:00";
|
string timeSpan = $"{datas[0].Substring(0, 4)}-{datas[0].Substring(4, 2)}-{datas[0].Substring(6, 2)} 00:00:00";
|
||||||
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
||||||
|
|
||||||
List<AnalysisBaseDto<decimal>> data = datas.GenerateFinalResultTd_d(3, dataType, timeSpan, "日冻结一象限无功电能示值").IsValidData(new List<string>() { "0D_165", "0D_165_1", "0D_165_2", "0D_165_3", "0D_165_4" });
|
List<AnalysisBaseDto<decimal?>> data = datas.GenerateFinalResultTd_d(3, dataType, timeSpan, "日冻结一象限无功电能示值").IsValidData(new List<string>() { "0D_165", "0D_165_1", "0D_165_2", "0D_165_3", "0D_165_4" });
|
||||||
if (data.Count > 0)
|
if (data.Count > 0)
|
||||||
{
|
{
|
||||||
// 查询电表信息
|
// 查询电表信息
|
||||||
@ -52,7 +52,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
UnitDataAnalysis<List<AnalysisBaseDto<decimal>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal>>>
|
UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>>
|
||||||
{
|
{
|
||||||
Code = input.A.Code!,
|
Code = input.A.Code!,
|
||||||
AFN = input.AFN_FC.AFN,
|
AFN = input.AFN_FC.AFN,
|
||||||
@ -67,7 +67,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
DensityUnit = DensityUnit.Day,
|
DensityUnit = DensityUnit.Day,
|
||||||
ReceivedTime = input.ReceivedTime
|
ReceivedTime = input.ReceivedTime
|
||||||
};
|
};
|
||||||
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal>(unitDataAnalysis);
|
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal?>(unitDataAnalysis);
|
||||||
result?.Invoke(unitDataAnalysis);
|
result?.Invoke(unitDataAnalysis);
|
||||||
return await Task.FromResult(true);
|
return await Task.FromResult(true);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -36,7 +36,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
string timeSpan = $"{datas[0].Substring(0, 4)}-{datas[0].Substring(4, 2)}-{datas[0].Substring(6, 2)} 00:00:00";
|
string timeSpan = $"{datas[0].Substring(0, 4)}-{datas[0].Substring(4, 2)}-{datas[0].Substring(6, 2)} 00:00:00";
|
||||||
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
||||||
|
|
||||||
List<AnalysisBaseDto<decimal>> data = datas.GenerateFinalResultTd_d(3, dataType, timeSpan, "日冻结二象限无功电能示值").IsValidData(new List<string>() { "0D_166", "0D_166_1", "0D_166_2", "0D_166_3", "0D_166_4" });
|
List<AnalysisBaseDto<decimal?>> data = datas.GenerateFinalResultTd_d(3, dataType, timeSpan, "日冻结二象限无功电能示值").IsValidData(new List<string>() { "0D_166", "0D_166_1", "0D_166_2", "0D_166_3", "0D_166_4" });
|
||||||
if (data.Count > 0)
|
if (data.Count > 0)
|
||||||
{
|
{
|
||||||
// 查询电表信息
|
// 查询电表信息
|
||||||
@ -52,7 +52,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
UnitDataAnalysis<List<AnalysisBaseDto<decimal>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal>>>
|
UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>>
|
||||||
{
|
{
|
||||||
Code = input.A.Code!,
|
Code = input.A.Code!,
|
||||||
AFN = input.AFN_FC.AFN,
|
AFN = input.AFN_FC.AFN,
|
||||||
@ -67,7 +67,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
DensityUnit = DensityUnit.Day,
|
DensityUnit = DensityUnit.Day,
|
||||||
ReceivedTime = input.ReceivedTime
|
ReceivedTime = input.ReceivedTime
|
||||||
};
|
};
|
||||||
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal>(unitDataAnalysis);
|
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal?>(unitDataAnalysis);
|
||||||
result?.Invoke(unitDataAnalysis);
|
result?.Invoke(unitDataAnalysis);
|
||||||
return await Task.FromResult(true);
|
return await Task.FromResult(true);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -36,7 +36,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
string timeSpan = $"{datas[0].Substring(0, 4)}-{datas[0].Substring(4, 2)}-{datas[0].Substring(6, 2)} 00:00:00";
|
string timeSpan = $"{datas[0].Substring(0, 4)}-{datas[0].Substring(4, 2)}-{datas[0].Substring(6, 2)} 00:00:00";
|
||||||
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
||||||
|
|
||||||
List<AnalysisBaseDto<decimal>> data = datas.GenerateFinalResultTd_d(3, dataType, timeSpan, "日冻结三象限无功电能示值").IsValidData(new List<string>() { "0D_167", "0D_167_1", "0D_167_2", "0D_167_3", "0D_167_4" });
|
List<AnalysisBaseDto<decimal?>> data = datas.GenerateFinalResultTd_d(3, dataType, timeSpan, "日冻结三象限无功电能示值").IsValidData(new List<string>() { "0D_167", "0D_167_1", "0D_167_2", "0D_167_3", "0D_167_4" });
|
||||||
if (data.Count > 0)
|
if (data.Count > 0)
|
||||||
{
|
{
|
||||||
// 查询电表信息
|
// 查询电表信息
|
||||||
@ -52,7 +52,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
UnitDataAnalysis<List<AnalysisBaseDto<decimal>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal>>>
|
UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>>
|
||||||
{
|
{
|
||||||
Code = input.A.Code!,
|
Code = input.A.Code!,
|
||||||
AFN = input.AFN_FC.AFN,
|
AFN = input.AFN_FC.AFN,
|
||||||
@ -67,7 +67,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
DensityUnit = DensityUnit.Day,
|
DensityUnit = DensityUnit.Day,
|
||||||
ReceivedTime = input.ReceivedTime
|
ReceivedTime = input.ReceivedTime
|
||||||
};
|
};
|
||||||
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal>(unitDataAnalysis);
|
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal?>(unitDataAnalysis);
|
||||||
result?.Invoke(unitDataAnalysis);
|
result?.Invoke(unitDataAnalysis);
|
||||||
return await Task.FromResult(true);
|
return await Task.FromResult(true);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -36,7 +36,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
string timeSpan = $"{datas[0].Substring(0, 4)}-{datas[0].Substring(4, 2)}-{datas[0].Substring(6, 2)} 00:00:00";
|
string timeSpan = $"{datas[0].Substring(0, 4)}-{datas[0].Substring(4, 2)}-{datas[0].Substring(6, 2)} 00:00:00";
|
||||||
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
||||||
|
|
||||||
List<AnalysisBaseDto<decimal>> data = datas.GenerateFinalResultTd_d(3, dataType, timeSpan, "日冻结四象限无功电能示值").IsValidData(new List<string>() { "0D_168", "0D_168_1", "0D_168_2", "0D_168_3", "0D_168_4" });
|
List<AnalysisBaseDto<decimal?>> data = datas.GenerateFinalResultTd_d(3, dataType, timeSpan, "日冻结四象限无功电能示值").IsValidData(new List<string>() { "0D_168", "0D_168_1", "0D_168_2", "0D_168_3", "0D_168_4" });
|
||||||
if (data.Count > 0)
|
if (data.Count > 0)
|
||||||
{
|
{
|
||||||
// 查询电表信息
|
// 查询电表信息
|
||||||
@ -52,7 +52,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
UnitDataAnalysis<List<AnalysisBaseDto<decimal>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal>>>
|
UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>>
|
||||||
{
|
{
|
||||||
Code = input.A.Code!,
|
Code = input.A.Code!,
|
||||||
AFN = input.AFN_FC.AFN,
|
AFN = input.AFN_FC.AFN,
|
||||||
@ -67,7 +67,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
DensityUnit = DensityUnit.Day,
|
DensityUnit = DensityUnit.Day,
|
||||||
ReceivedTime = input.ReceivedTime
|
ReceivedTime = input.ReceivedTime
|
||||||
};
|
};
|
||||||
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal>(unitDataAnalysis);
|
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal?>(unitDataAnalysis);
|
||||||
result?.Invoke(unitDataAnalysis);
|
result?.Invoke(unitDataAnalysis);
|
||||||
return await Task.FromResult(true);
|
return await Task.FromResult(true);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -35,7 +35,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
List<string> datas = await AnalysisDataUnitAsync(input.UnitData.HexMessageList);
|
List<string> datas = await AnalysisDataUnitAsync(input.UnitData.HexMessageList);
|
||||||
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
||||||
string timeSpan = $"{datas[0].Substring(0, 4)}-{datas[0].Substring(4, 2)}-01 00:00:00";
|
string timeSpan = $"{datas[0].Substring(0, 4)}-{datas[0].Substring(4, 2)}-01 00:00:00";
|
||||||
List<AnalysisBaseDto<decimal>> data = datas.GenerateFinalResultTd_m(3, dataType, timeSpan, "月冻结正向有功电能示值").IsValidData(new List<string>() { "0D_177", "0D_177_1", "0D_177_2", "0D_177_3", "0D_177_4" });
|
List<AnalysisBaseDto<decimal?>> data = datas.GenerateFinalResultTd_m(3, dataType, timeSpan, "月冻结正向有功电能示值").IsValidData(new List<string>() { "0D_177", "0D_177_1", "0D_177_2", "0D_177_3", "0D_177_4" });
|
||||||
if (data.Count > 0)
|
if (data.Count > 0)
|
||||||
{
|
{
|
||||||
// 查询电表信息
|
// 查询电表信息
|
||||||
@ -51,7 +51,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
UnitDataAnalysis<List<AnalysisBaseDto<decimal>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal>>>
|
UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>>
|
||||||
{
|
{
|
||||||
Code = input.A.Code!,
|
Code = input.A.Code!,
|
||||||
AFN = input.AFN_FC.AFN,
|
AFN = input.AFN_FC.AFN,
|
||||||
@ -66,7 +66,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
DensityUnit = DensityUnit.Month,
|
DensityUnit = DensityUnit.Month,
|
||||||
ReceivedTime = input.ReceivedTime
|
ReceivedTime = input.ReceivedTime
|
||||||
};
|
};
|
||||||
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal>(unitDataAnalysis);
|
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal?>(unitDataAnalysis);
|
||||||
result?.Invoke(unitDataAnalysis);
|
result?.Invoke(unitDataAnalysis);
|
||||||
return await Task.FromResult(true);
|
return await Task.FromResult(true);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -36,7 +36,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
List<string> datas = await AnalysisDataUnitAsync(input.UnitData.HexMessageList);
|
List<string> datas = await AnalysisDataUnitAsync(input.UnitData.HexMessageList);
|
||||||
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
||||||
string timeSpan = $"{datas[0].Substring(0, 4)}-{datas[0].Substring(4, 2)}-01 00:00:00";
|
string timeSpan = $"{datas[0].Substring(0, 4)}-{datas[0].Substring(4, 2)}-01 00:00:00";
|
||||||
List<AnalysisBaseDto<decimal>> data = datas.GenerateFinalResultTd_m(3, dataType, timeSpan, "月冻结正向无功(组合无功 1)电能示值").IsValidData(new List<string>() { "0D_178", "0D_178_1", "0D_178_2", "0D_178_3", "0D_178_4" });
|
List<AnalysisBaseDto<decimal?>> data = datas.GenerateFinalResultTd_m(3, dataType, timeSpan, "月冻结正向无功(组合无功 1)电能示值").IsValidData(new List<string>() { "0D_178", "0D_178_1", "0D_178_2", "0D_178_3", "0D_178_4" });
|
||||||
if (data.Count > 0)
|
if (data.Count > 0)
|
||||||
{
|
{
|
||||||
// 查询电表信息
|
// 查询电表信息
|
||||||
@ -52,7 +52,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
UnitDataAnalysis<List<AnalysisBaseDto<decimal>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal>>>
|
UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>>
|
||||||
{
|
{
|
||||||
Code = input.A.Code!,
|
Code = input.A.Code!,
|
||||||
AFN = input.AFN_FC.AFN,
|
AFN = input.AFN_FC.AFN,
|
||||||
@ -67,7 +67,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
DensityUnit = DensityUnit.Month,
|
DensityUnit = DensityUnit.Month,
|
||||||
ReceivedTime = input.ReceivedTime
|
ReceivedTime = input.ReceivedTime
|
||||||
};
|
};
|
||||||
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal>(unitDataAnalysis);
|
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal?>(unitDataAnalysis);
|
||||||
result?.Invoke(unitDataAnalysis);
|
result?.Invoke(unitDataAnalysis);
|
||||||
return await Task.FromResult(true);
|
return await Task.FromResult(true);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -36,7 +36,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
List<string> datas = await AnalysisDataUnitAsync(input.UnitData.HexMessageList);
|
List<string> datas = await AnalysisDataUnitAsync(input.UnitData.HexMessageList);
|
||||||
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
||||||
string timeSpan = $"{datas[0].Substring(0, 4)}-{datas[0].Substring(4, 2)}-01 00:00:00";
|
string timeSpan = $"{datas[0].Substring(0, 4)}-{datas[0].Substring(4, 2)}-01 00:00:00";
|
||||||
List<AnalysisBaseDto<decimal>> data = datas.GenerateFinalResultTd_m(3, dataType, timeSpan, "反向有功总电能示值").IsValidData(new List<string>() { "0D_179", "0D_179_1", "0D_179_2", "0D_179_3", "0D_179_4" });
|
List<AnalysisBaseDto<decimal?>> data = datas.GenerateFinalResultTd_m(3, dataType, timeSpan, "反向有功总电能示值").IsValidData(new List<string>() { "0D_179", "0D_179_1", "0D_179_2", "0D_179_3", "0D_179_4" });
|
||||||
if (data.Count > 0)
|
if (data.Count > 0)
|
||||||
{
|
{
|
||||||
// 查询电表信息
|
// 查询电表信息
|
||||||
@ -52,7 +52,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
UnitDataAnalysis<List<AnalysisBaseDto<decimal>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal>>>
|
UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>>
|
||||||
{
|
{
|
||||||
Code = input.A.Code!,
|
Code = input.A.Code!,
|
||||||
AFN = input.AFN_FC.AFN,
|
AFN = input.AFN_FC.AFN,
|
||||||
@ -67,7 +67,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
DensityUnit = DensityUnit.Month,
|
DensityUnit = DensityUnit.Month,
|
||||||
ReceivedTime = input.ReceivedTime
|
ReceivedTime = input.ReceivedTime
|
||||||
};
|
};
|
||||||
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal>(unitDataAnalysis);
|
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal?>(unitDataAnalysis);
|
||||||
result?.Invoke(unitDataAnalysis);
|
result?.Invoke(unitDataAnalysis);
|
||||||
return await Task.FromResult(true);
|
return await Task.FromResult(true);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -35,7 +35,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
List<string> datas = await AnalysisDataUnitAsync(input.UnitData.HexMessageList);
|
List<string> datas = await AnalysisDataUnitAsync(input.UnitData.HexMessageList);
|
||||||
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
||||||
string timeSpan = $"{datas[0].Substring(0, 4)}-{datas[0].Substring(4, 2)}-01 00:00:00";
|
string timeSpan = $"{datas[0].Substring(0, 4)}-{datas[0].Substring(4, 2)}-01 00:00:00";
|
||||||
List<AnalysisBaseDto<decimal>> data = datas.GenerateFinalResultTd_m(3, dataType, timeSpan, "月冻结反向无功(组合无功 1)电能示值").IsValidData(new List<string>() { "0D_180", "0D_180_1", "0D_180_2", "0D_180_3", "0D_180_4" });
|
List<AnalysisBaseDto<decimal?>> data = datas.GenerateFinalResultTd_m(3, dataType, timeSpan, "月冻结反向无功(组合无功 1)电能示值").IsValidData(new List<string>() { "0D_180", "0D_180_1", "0D_180_2", "0D_180_3", "0D_180_4" });
|
||||||
if (data.Count > 0)
|
if (data.Count > 0)
|
||||||
{
|
{
|
||||||
// 查询电表信息
|
// 查询电表信息
|
||||||
@ -51,7 +51,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
UnitDataAnalysis<List<AnalysisBaseDto<decimal>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal>>>
|
UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>>
|
||||||
{
|
{
|
||||||
Code = input.A.Code!,
|
Code = input.A.Code!,
|
||||||
AFN = input.AFN_FC.AFN,
|
AFN = input.AFN_FC.AFN,
|
||||||
@ -66,7 +66,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
DensityUnit = DensityUnit.Month,
|
DensityUnit = DensityUnit.Month,
|
||||||
ReceivedTime = input.ReceivedTime
|
ReceivedTime = input.ReceivedTime
|
||||||
};
|
};
|
||||||
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal>(unitDataAnalysis);
|
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal?>(unitDataAnalysis);
|
||||||
result?.Invoke(unitDataAnalysis);
|
result?.Invoke(unitDataAnalysis);
|
||||||
return await Task.FromResult(true);
|
return await Task.FromResult(true);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -36,7 +36,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
List<string> datas = await AnalysisDataUnitAsync(input.UnitData.HexMessageList);
|
List<string> datas = await AnalysisDataUnitAsync(input.UnitData.HexMessageList);
|
||||||
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
||||||
string timeSpan = $"{datas[0].Substring(0, 4)}-{datas[0].Substring(4, 2)}-01 00:00:00";
|
string timeSpan = $"{datas[0].Substring(0, 4)}-{datas[0].Substring(4, 2)}-01 00:00:00";
|
||||||
List<AnalysisBaseDto<decimal>> data = datas.GenerateFinalResultTd_m(3, dataType, timeSpan, "月冻结一象限无功电能示值(总、费率 1~M)").IsValidData(new List<string>() { "0D_181", "0D_181_1", "0D_181_2", "0D_181_3", "0D_181_4" });
|
List<AnalysisBaseDto<decimal?>> data = datas.GenerateFinalResultTd_m(3, dataType, timeSpan, "月冻结一象限无功电能示值(总、费率 1~M)").IsValidData(new List<string>() { "0D_181", "0D_181_1", "0D_181_2", "0D_181_3", "0D_181_4" });
|
||||||
if (data.Count > 0)
|
if (data.Count > 0)
|
||||||
{
|
{
|
||||||
// 查询电表信息
|
// 查询电表信息
|
||||||
@ -52,7 +52,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
UnitDataAnalysis<List<AnalysisBaseDto<decimal>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal>>>
|
UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>>
|
||||||
{
|
{
|
||||||
Code = input.A.Code!,
|
Code = input.A.Code!,
|
||||||
AFN = input.AFN_FC.AFN,
|
AFN = input.AFN_FC.AFN,
|
||||||
@ -67,7 +67,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
DensityUnit = DensityUnit.Month,
|
DensityUnit = DensityUnit.Month,
|
||||||
ReceivedTime = input.ReceivedTime
|
ReceivedTime = input.ReceivedTime
|
||||||
};
|
};
|
||||||
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal>(unitDataAnalysis);
|
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal?>(unitDataAnalysis);
|
||||||
result?.Invoke(unitDataAnalysis);
|
result?.Invoke(unitDataAnalysis);
|
||||||
return await Task.FromResult(true);
|
return await Task.FromResult(true);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -36,7 +36,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
List<string> datas = await AnalysisDataUnitAsync(input.UnitData.HexMessageList);
|
List<string> datas = await AnalysisDataUnitAsync(input.UnitData.HexMessageList);
|
||||||
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
||||||
string timeSpan = $"{datas[0].Substring(0, 4)}-{datas[0].Substring(4, 2)}-01 00:00:00";
|
string timeSpan = $"{datas[0].Substring(0, 4)}-{datas[0].Substring(4, 2)}-01 00:00:00";
|
||||||
List<AnalysisBaseDto<decimal>> data = datas.GenerateFinalResultTd_m(3, dataType, timeSpan, "月冻结二象限无功电能示值(总、费率 1~M)").IsValidData(new List<string>() { "0D_182", "0D_182_1", "0D_182_2", "0D_182_3", "0D_182_4" });
|
List<AnalysisBaseDto<decimal?>> data = datas.GenerateFinalResultTd_m(3, dataType, timeSpan, "月冻结二象限无功电能示值(总、费率 1~M)").IsValidData(new List<string>() { "0D_182", "0D_182_1", "0D_182_2", "0D_182_3", "0D_182_4" });
|
||||||
if (data.Count > 0)
|
if (data.Count > 0)
|
||||||
{
|
{
|
||||||
// 查询电表信息
|
// 查询电表信息
|
||||||
@ -52,7 +52,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
UnitDataAnalysis<List<AnalysisBaseDto<decimal>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal>>>
|
UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>>
|
||||||
{
|
{
|
||||||
Code = input.A.Code!,
|
Code = input.A.Code!,
|
||||||
AFN = input.AFN_FC.AFN,
|
AFN = input.AFN_FC.AFN,
|
||||||
@ -67,7 +67,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
DensityUnit = DensityUnit.Month,
|
DensityUnit = DensityUnit.Month,
|
||||||
ReceivedTime = input.ReceivedTime
|
ReceivedTime = input.ReceivedTime
|
||||||
};
|
};
|
||||||
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal>(unitDataAnalysis);
|
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal?>(unitDataAnalysis);
|
||||||
result?.Invoke(unitDataAnalysis);
|
result?.Invoke(unitDataAnalysis);
|
||||||
return await Task.FromResult(true);
|
return await Task.FromResult(true);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -35,7 +35,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
List<string> datas = await AnalysisDataUnitAsync(input.UnitData.HexMessageList);
|
List<string> datas = await AnalysisDataUnitAsync(input.UnitData.HexMessageList);
|
||||||
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
||||||
string timeSpan = $"{datas[0].Substring(0, 4)}-{datas[0].Substring(4, 2)}-01 00:00:00";
|
string timeSpan = $"{datas[0].Substring(0, 4)}-{datas[0].Substring(4, 2)}-01 00:00:00";
|
||||||
List<AnalysisBaseDto<decimal>> data = datas.GenerateFinalResultTd_m(3, dataType, timeSpan, "月冻结三象限无功电能示值(总、费率 1~M)").IsValidData(new List<string>() { "0D_183", "0D_183_1", "0D_183_2", "0D_183_3", "0D_183_4" });
|
List<AnalysisBaseDto<decimal?>> data = datas.GenerateFinalResultTd_m(3, dataType, timeSpan, "月冻结三象限无功电能示值(总、费率 1~M)").IsValidData(new List<string>() { "0D_183", "0D_183_1", "0D_183_2", "0D_183_3", "0D_183_4" });
|
||||||
if (data.Count > 0)
|
if (data.Count > 0)
|
||||||
{
|
{
|
||||||
// 查询电表信息
|
// 查询电表信息
|
||||||
@ -51,7 +51,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
UnitDataAnalysis<List<AnalysisBaseDto<decimal>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal>>>
|
UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>>
|
||||||
{
|
{
|
||||||
Code = input.A.Code!,
|
Code = input.A.Code!,
|
||||||
AFN = input.AFN_FC.AFN,
|
AFN = input.AFN_FC.AFN,
|
||||||
@ -66,7 +66,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
DensityUnit = DensityUnit.Month,
|
DensityUnit = DensityUnit.Month,
|
||||||
ReceivedTime = input.ReceivedTime
|
ReceivedTime = input.ReceivedTime
|
||||||
};
|
};
|
||||||
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal>(unitDataAnalysis);
|
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal?>(unitDataAnalysis);
|
||||||
result?.Invoke(unitDataAnalysis);
|
result?.Invoke(unitDataAnalysis);
|
||||||
return await Task.FromResult(true);
|
return await Task.FromResult(true);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -36,7 +36,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
List<string> datas = await AnalysisDataUnitAsync(input.UnitData.HexMessageList);
|
List<string> datas = await AnalysisDataUnitAsync(input.UnitData.HexMessageList);
|
||||||
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
||||||
string timeSpan = $"{datas[0].Substring(0, 4)}-{datas[0].Substring(4, 2)}-01 00:00:00";
|
string timeSpan = $"{datas[0].Substring(0, 4)}-{datas[0].Substring(4, 2)}-01 00:00:00";
|
||||||
List<AnalysisBaseDto<decimal>> data = datas.GenerateFinalResultTd_m(3, dataType, timeSpan, "月冻结四象限无功电能示值(总、费率 1~M)").IsValidData(new List<string>() { "0D_184", "0D_184_1", "0D_184_2", "0D_184_3", "0D_184_4" });
|
List<AnalysisBaseDto<decimal?>> data = datas.GenerateFinalResultTd_m(3, dataType, timeSpan, "月冻结四象限无功电能示值(总、费率 1~M)").IsValidData(new List<string>() { "0D_184", "0D_184_1", "0D_184_2", "0D_184_3", "0D_184_4" });
|
||||||
if (data.Count > 0)
|
if (data.Count > 0)
|
||||||
{
|
{
|
||||||
// 查询电表信息
|
// 查询电表信息
|
||||||
@ -52,7 +52,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
UnitDataAnalysis<List<AnalysisBaseDto<decimal>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal>>>
|
UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>>
|
||||||
{
|
{
|
||||||
Code = input.A.Code!,
|
Code = input.A.Code!,
|
||||||
AFN = input.AFN_FC.AFN,
|
AFN = input.AFN_FC.AFN,
|
||||||
@ -67,7 +67,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
DensityUnit = DensityUnit.Month,
|
DensityUnit = DensityUnit.Month,
|
||||||
ReceivedTime = input.ReceivedTime
|
ReceivedTime = input.ReceivedTime
|
||||||
};
|
};
|
||||||
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal>(unitDataAnalysis);
|
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal?>(unitDataAnalysis);
|
||||||
result?.Invoke(unitDataAnalysis);
|
result?.Invoke(unitDataAnalysis);
|
||||||
return await Task.FromResult(true);
|
return await Task.FromResult(true);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -37,7 +37,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
string timeSpan = $"{datas[0].Substring(0, 4)}-{datas[0].Substring(4, 2)}-{datas[0].Substring(6, 2)} 00:00:00";
|
string timeSpan = $"{datas[0].Substring(0, 4)}-{datas[0].Substring(4, 2)}-{datas[0].Substring(6, 2)} 00:00:00";
|
||||||
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
||||||
|
|
||||||
List<AnalysisBaseDto<decimal>> data = datas.GenerateFinalResultTd_d(3, dataType, timeSpan, "抄表日冻结正向有功最大需量及发生时间");
|
List<AnalysisBaseDto<decimal?>> data = datas.GenerateFinalResultTd_d(3, dataType, timeSpan, "抄表日冻结正向有功最大需量及发生时间");
|
||||||
if (data.Count > 0)
|
if (data.Count > 0)
|
||||||
{
|
{
|
||||||
// 查询电表信息
|
// 查询电表信息
|
||||||
@ -53,7 +53,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
UnitDataAnalysis<List<AnalysisBaseDto<decimal>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal>>>
|
UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>>
|
||||||
{
|
{
|
||||||
Code = input.A.Code!,
|
Code = input.A.Code!,
|
||||||
AFN = input.AFN_FC.AFN,
|
AFN = input.AFN_FC.AFN,
|
||||||
@ -68,7 +68,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
DensityUnit = DensityUnit.Day,
|
DensityUnit = DensityUnit.Day,
|
||||||
ReceivedTime = input.ReceivedTime
|
ReceivedTime = input.ReceivedTime
|
||||||
};
|
};
|
||||||
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal>(unitDataAnalysis);
|
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal?>(unitDataAnalysis);
|
||||||
result?.Invoke(unitDataAnalysis);
|
result?.Invoke(unitDataAnalysis);
|
||||||
return await Task.FromResult(true);
|
return await Task.FromResult(true);
|
||||||
}
|
}
|
||||||
@ -87,13 +87,13 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
int ratingCount = hexMessageList.GetRatingCount(12, 1);
|
int ratingCount = hexMessageList.GetRatingCount(12, 1);
|
||||||
values.Add(ratingCount.ToString());
|
values.Add(ratingCount.ToString());
|
||||||
int handlerNum = 13;
|
int handlerNum = 13;
|
||||||
values.AddRange(await GetDataAsync<decimal>(hexMessageList.GetRange(handlerNum, 3), ratingCount, 3, nameof(Appendix_A23)));//正向有功总最大需量
|
values.AddRange(await GetDataAsync(hexMessageList.GetRange(handlerNum, 3), ratingCount, 3, nameof(Appendix_A23)));//正向有功总最大需量
|
||||||
handlerNum += 3;
|
handlerNum += 3;
|
||||||
values.AddRange(await GetDataAsync<string>(hexMessageList.GetRange(handlerNum, 4), ratingCount, 4, nameof(Appendix_A17)));//正向有功总最大需量发生时间
|
values.AddRange(await GetDataAsync(hexMessageList.GetRange(handlerNum, 4), ratingCount, 4, nameof(Appendix_A17)));//正向有功总最大需量发生时间
|
||||||
return values;
|
return values;
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<List<string>> GetDataAsync<T>(List<string> data, int ratingCount, int len, string appendixName)
|
private async Task<List<string>> GetDataAsync(List<string> data, int ratingCount, int len, string appendixName)
|
||||||
{
|
{
|
||||||
List<string> values = new List<string>();
|
List<string> values = new List<string>();
|
||||||
for (int i = 0; i < ratingCount + 1; i++)
|
for (int i = 0; i < ratingCount + 1; i++)
|
||||||
|
|||||||
@ -34,9 +34,8 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
ArgumentNullException.ThrowIfNull(input.UnitData?.HexMessageList);
|
ArgumentNullException.ThrowIfNull(input.UnitData?.HexMessageList);
|
||||||
|
|
||||||
List<string> datas = await AnalysisDataUnitAsync(input.UnitData.HexMessageList);
|
List<string> datas = await AnalysisDataUnitAsync(input.UnitData.HexMessageList);
|
||||||
|
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
||||||
AnalysisBaseDto<decimal> data = GenerateFinalResult(datas, "抄表日冻结正向无功最大需量及发生时间");
|
AnalysisBaseDto<decimal?> data = GenerateFinalResult(datas, "抄表日冻结正向无功最大需量及发生时间", dataType);
|
||||||
data.DataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
|
||||||
|
|
||||||
// 查询电表信息
|
// 查询电表信息
|
||||||
AmmeterInfo ammeterInfo = await _dataStorage.GetMeterInfoAsync(data.DeviceType.ToString(), "15");
|
AmmeterInfo ammeterInfo = await _dataStorage.GetMeterInfoAsync(data.DeviceType.ToString(), "15");
|
||||||
@ -47,7 +46,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
data.DatabaseBusiID = ammeterInfo.DatabaseBusiID;
|
data.DatabaseBusiID = ammeterInfo.DatabaseBusiID;
|
||||||
data.DeviceAddress = ammeterInfo.AmmerterAddress;
|
data.DeviceAddress = ammeterInfo.AmmerterAddress;
|
||||||
}
|
}
|
||||||
UnitDataAnalysis<AnalysisBaseDto<decimal>> unitDataAnalysis = new UnitDataAnalysis<AnalysisBaseDto<decimal>>
|
UnitDataAnalysis<AnalysisBaseDto<decimal?>> unitDataAnalysis = new UnitDataAnalysis<AnalysisBaseDto<decimal?>>
|
||||||
{
|
{
|
||||||
Code = input.A.Code!,
|
Code = input.A.Code!,
|
||||||
AFN = input.AFN_FC.AFN,
|
AFN = input.AFN_FC.AFN,
|
||||||
@ -62,7 +61,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
DensityUnit = DensityUnit.Day,
|
DensityUnit = DensityUnit.Day,
|
||||||
ReceivedTime = input.ReceivedTime
|
ReceivedTime = input.ReceivedTime
|
||||||
};
|
};
|
||||||
await _dataStorage.SaveDataToIotDbAsync<decimal>(unitDataAnalysis);
|
await _dataStorage.SaveDataToIotDbAsync<decimal?>(unitDataAnalysis);
|
||||||
result?.Invoke(unitDataAnalysis);
|
result?.Invoke(unitDataAnalysis);
|
||||||
return await Task.FromResult(true);
|
return await Task.FromResult(true);
|
||||||
}
|
}
|
||||||
@ -81,18 +80,18 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
int ratingCount = hexMessageList.GetRatingCount(12, 1);
|
int ratingCount = hexMessageList.GetRatingCount(12, 1);
|
||||||
values.Add(ratingCount.ToString());
|
values.Add(ratingCount.ToString());
|
||||||
int handlerNum = 13;
|
int handlerNum = 13;
|
||||||
values.AddRange(await GetDataAsync<decimal>(hexMessageList.GetRange(handlerNum, 3 * (ratingCount + 1)), ratingCount, 3, nameof(Appendix_A23)));//正向有功总最大需量
|
values.AddRange(await GetDataAsync(hexMessageList.GetRange(handlerNum, 3 * (ratingCount + 1)), ratingCount, 3, nameof(Appendix_A23)));//正向有功总最大需量
|
||||||
handlerNum += 3 * (ratingCount + 1);//12
|
handlerNum += 3 * (ratingCount + 1);//12
|
||||||
values.AddRange(await GetDataAsync<string>(hexMessageList.GetRange(handlerNum, 4 * (ratingCount + 1)), ratingCount, 4, nameof(Appendix_A17)));//正向有功总最大需量发生时间
|
values.AddRange(await GetDataAsync(hexMessageList.GetRange(handlerNum, 4 * (ratingCount + 1)), ratingCount, 4, nameof(Appendix_A17)));//正向有功总最大需量发生时间
|
||||||
handlerNum += 4 * (ratingCount + 1);//28
|
handlerNum += 4 * (ratingCount + 1);//28
|
||||||
values.AddRange(await GetDataAsync<decimal>(hexMessageList.GetRange(handlerNum, 3 * (ratingCount + 1)), ratingCount, 3, nameof(Appendix_A23)));//正向无功总最大需量
|
values.AddRange(await GetDataAsync(hexMessageList.GetRange(handlerNum, 3 * (ratingCount + 1)), ratingCount, 3, nameof(Appendix_A23)));//正向无功总最大需量
|
||||||
handlerNum += 3 * (ratingCount + 1);//48
|
handlerNum += 3 * (ratingCount + 1);//48
|
||||||
values.AddRange(await GetDataAsync<string>(hexMessageList.GetRange(handlerNum, 4 * (ratingCount + 1)), ratingCount, 4, nameof(Appendix_A17)));//正向无功总最大需量发生时间
|
values.AddRange(await GetDataAsync(hexMessageList.GetRange(handlerNum, 4 * (ratingCount + 1)), ratingCount, 4, nameof(Appendix_A17)));//正向无功总最大需量发生时间
|
||||||
handlerNum += 4 * (ratingCount + 1);
|
handlerNum += 4 * (ratingCount + 1);
|
||||||
return values;
|
return values;
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<List<string>> GetDataAsync<T>(List<string> data, int ratingCount, int len, string appendixName)
|
private async Task<List<string>> GetDataAsync(List<string> data, int ratingCount, int len, string appendixName)
|
||||||
{
|
{
|
||||||
List<string> values = new List<string>();
|
List<string> values = new List<string>();
|
||||||
for (int i = 0; i < ratingCount + 1; i++)
|
for (int i = 0; i < ratingCount + 1; i++)
|
||||||
@ -112,15 +111,13 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
return values;
|
return values;
|
||||||
}
|
}
|
||||||
|
|
||||||
public AnalysisBaseDto<decimal> GenerateFinalResult(List<string> data, string filedDesc = "")
|
public AnalysisBaseDto<decimal?> GenerateFinalResult(List<string> data, string filedDesc,string dataType)
|
||||||
{
|
{
|
||||||
List<AnalysisBaseDto<decimal>> list = new List<AnalysisBaseDto<decimal>>();
|
List<AnalysisBaseDto<decimal?>> list = new List<AnalysisBaseDto<decimal?>>();
|
||||||
AnalysisBaseDto<decimal> meter = new AnalysisBaseDto<decimal>
|
AnalysisBaseDto<decimal?> meter = new AnalysisBaseDto<decimal?>
|
||||||
{
|
{
|
||||||
DeviceType = MeterTypeEnum.Ammeter
|
DeviceType = MeterTypeEnum.Ammeter
|
||||||
};
|
};
|
||||||
|
|
||||||
decimal value = 0;
|
|
||||||
var errorCode = data[3].CheckErrorCode();
|
var errorCode = data[3].CheckErrorCode();
|
||||||
if (errorCode != null)
|
if (errorCode != null)
|
||||||
{
|
{
|
||||||
@ -128,15 +125,18 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
meter.ErrorCodeMsg = errorCode.Item2;
|
meter.ErrorCodeMsg = errorCode.Item2;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
decimal.TryParse(data[3], out value);
|
{
|
||||||
|
if(decimal.TryParse(data[3], out decimal value))
|
||||||
|
{
|
||||||
meter.DataValue = value;
|
meter.DataValue = value;
|
||||||
|
}
|
||||||
string timeSpan = $"{DateTime.Now.Year}-{data[4].Substring(0, 2)}-{data[4].Substring(2, 2)} {data[4].Substring(4, 2)}:{data[4].Substring(6, 2)}:00";//$"{data[0].Substring(0, 4)}-{data[0].Substring(4, 2)}-{data[0].Substring(6, 2)}";
|
}
|
||||||
DateTime readingDate = DateTime.Now;
|
string timeSpan = $"{DateTime.Now.Year}-{data[4].Substring(0, 2)}-{data[4].Substring(2, 2)} {data[4].Substring(4, 2)}:{data[4].Substring(6, 2)}:00";
|
||||||
if (DateTime.TryParse(timeSpan, out readingDate))
|
if (DateTime.TryParse(timeSpan, out DateTime readingDate))
|
||||||
{
|
{
|
||||||
meter.TimeSpan = readingDate;
|
meter.TimeSpan = readingDate;
|
||||||
}
|
}
|
||||||
|
meter.DataType = dataType;
|
||||||
meter.FiledDesc = filedDesc;
|
meter.FiledDesc = filedDesc;
|
||||||
meter.FiledName = meter.DataType.GetDataFieldByGatherDataType() ?? string.Empty;
|
meter.FiledName = meter.DataType.GetDataFieldByGatherDataType() ?? string.Empty;
|
||||||
return meter;
|
return meter;
|
||||||
|
|||||||
@ -35,9 +35,9 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
ArgumentNullException.ThrowIfNull(input.UnitData?.HexMessageList);
|
ArgumentNullException.ThrowIfNull(input.UnitData?.HexMessageList);
|
||||||
|
|
||||||
List<string> datas = await AnalysisDataUnitAsync(input.UnitData.HexMessageList);
|
List<string> datas = await AnalysisDataUnitAsync(input.UnitData.HexMessageList);
|
||||||
|
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
||||||
|
|
||||||
AnalysisBaseDto<decimal> data = GenerateFinalResult(datas, "月冻结正向有功最大需量及发生时间");
|
AnalysisBaseDto<decimal?> data = GenerateFinalResult(datas, "月冻结正向有功最大需量及发生时间", dataType);
|
||||||
data.DataType= $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
|
||||||
// 查询电表信息
|
// 查询电表信息
|
||||||
AmmeterInfo ammeterInfo = await _dataStorage.GetMeterInfoAsync(data.DeviceType.ToString(), "15");
|
AmmeterInfo ammeterInfo = await _dataStorage.GetMeterInfoAsync(data.DeviceType.ToString(), "15");
|
||||||
if (ammeterInfo != null)
|
if (ammeterInfo != null)
|
||||||
@ -47,7 +47,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
data.DatabaseBusiID = ammeterInfo.DatabaseBusiID;
|
data.DatabaseBusiID = ammeterInfo.DatabaseBusiID;
|
||||||
data.DeviceAddress = ammeterInfo.AmmerterAddress;
|
data.DeviceAddress = ammeterInfo.AmmerterAddress;
|
||||||
}
|
}
|
||||||
UnitDataAnalysis<AnalysisBaseDto<decimal>> unitDataAnalysis = new UnitDataAnalysis<AnalysisBaseDto<decimal>>
|
UnitDataAnalysis<AnalysisBaseDto<decimal?>> unitDataAnalysis = new UnitDataAnalysis<AnalysisBaseDto<decimal?>>
|
||||||
{
|
{
|
||||||
Code = input.A.Code!,
|
Code = input.A.Code!,
|
||||||
AFN = input.AFN_FC.AFN,
|
AFN = input.AFN_FC.AFN,
|
||||||
@ -62,7 +62,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
DensityUnit = DensityUnit.Month,
|
DensityUnit = DensityUnit.Month,
|
||||||
ReceivedTime = input.ReceivedTime
|
ReceivedTime = input.ReceivedTime
|
||||||
};
|
};
|
||||||
await _dataStorage.SaveDataToIotDbAsync<decimal>(unitDataAnalysis);
|
await _dataStorage.SaveDataToIotDbAsync<decimal?>(unitDataAnalysis);
|
||||||
result?.Invoke(unitDataAnalysis);
|
result?.Invoke(unitDataAnalysis);
|
||||||
return await Task.FromResult(true);
|
return await Task.FromResult(true);
|
||||||
}
|
}
|
||||||
@ -83,13 +83,13 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
int ratingCount = hexMessageList.GetRatingCount(11, 1);
|
int ratingCount = hexMessageList.GetRatingCount(11, 1);
|
||||||
values.Add(ratingCount.ToString());
|
values.Add(ratingCount.ToString());
|
||||||
int handlerNum = 12;
|
int handlerNum = 12;
|
||||||
values.AddRange(await GetDataAsync<decimal>(hexMessageList.GetRange(handlerNum, 3), 3, nameof(Appendix_A23)));//正向有功总最大需量
|
values.AddRange(await GetDataAsync(hexMessageList.GetRange(handlerNum, 3), 3, nameof(Appendix_A23)));//正向有功总最大需量
|
||||||
handlerNum += 3;
|
handlerNum += 3;
|
||||||
values.AddRange(await GetDataAsync<string>(hexMessageList.GetRange(handlerNum, 4), 4, nameof(Appendix_A17)));//正向有功总最大需量发生时间
|
values.AddRange(await GetDataAsync(hexMessageList.GetRange(handlerNum, 4), 4, nameof(Appendix_A17)));//正向有功总最大需量发生时间
|
||||||
return values;
|
return values;
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<List<string>> GetDataAsync<T>(List<string> data, int len, string appendixName)
|
private async Task<List<string>> GetDataAsync(List<string> data, int len, string appendixName)
|
||||||
{
|
{
|
||||||
List<string> values = new List<string>();
|
List<string> values = new List<string>();
|
||||||
var errorCode = data.CheckErrorCode();
|
var errorCode = data.CheckErrorCode();
|
||||||
@ -104,14 +104,12 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
}
|
}
|
||||||
return values;
|
return values;
|
||||||
}
|
}
|
||||||
public AnalysisBaseDto<decimal> GenerateFinalResult(List<string> data, string filedDesc = "")
|
public AnalysisBaseDto<decimal?> GenerateFinalResult(List<string> data, string filedDesc, string dataType)
|
||||||
{
|
{
|
||||||
AnalysisBaseDto<decimal> meter = new AnalysisBaseDto<decimal>
|
AnalysisBaseDto<decimal?> meter = new AnalysisBaseDto<decimal?>
|
||||||
{
|
{
|
||||||
DeviceType = MeterTypeEnum.Ammeter,
|
DeviceType = MeterTypeEnum.Ammeter,
|
||||||
};
|
};
|
||||||
|
|
||||||
decimal value = 0;
|
|
||||||
var errorCode = data[3].CheckErrorCode();
|
var errorCode = data[3].CheckErrorCode();
|
||||||
if (errorCode != null)
|
if (errorCode != null)
|
||||||
{
|
{
|
||||||
@ -119,15 +117,18 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
meter.ErrorCodeMsg = errorCode.Item2;
|
meter.ErrorCodeMsg = errorCode.Item2;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
decimal.TryParse(data[3], out value);
|
{
|
||||||
|
if(decimal.TryParse(data[3], out decimal value))
|
||||||
|
{
|
||||||
meter.DataValue = value;
|
meter.DataValue = value;
|
||||||
|
}
|
||||||
string timeSpan = $"{data[0].Substring(0, 4)}-{data[4].Substring(0, 2)}-{data[4].Substring(2, 2)} {data[4].Substring(4, 2)}:{data[4].Substring(6, 2)}:00";//$"{data[0].Substring(0, 4)}-{data[0].Substring(4, 2)}-{data[0].Substring(6, 2)}";
|
}
|
||||||
DateTime readingDate = DateTime.Now;
|
string timeSpan = $"{data[0].Substring(0, 4)}-{data[4].Substring(0, 2)}-{data[4].Substring(2, 2)} {data[4].Substring(4, 2)}:{data[4].Substring(6, 2)}:00";
|
||||||
if (DateTime.TryParse(timeSpan, out readingDate))
|
if (DateTime.TryParse(timeSpan, out DateTime readingDate))
|
||||||
{
|
{
|
||||||
meter.TimeSpan = readingDate;
|
meter.TimeSpan = readingDate;
|
||||||
}
|
}
|
||||||
|
meter.DataType = dataType;
|
||||||
meter.FiledDesc = filedDesc;
|
meter.FiledDesc = filedDesc;
|
||||||
meter.FiledName = meter.DataType.GetDataFieldByGatherDataType() ?? string.Empty;
|
meter.FiledName = meter.DataType.GetDataFieldByGatherDataType() ?? string.Empty;
|
||||||
return meter;
|
return meter;
|
||||||
|
|||||||
@ -35,9 +35,9 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
ArgumentNullException.ThrowIfNull(input.UnitData?.HexMessageList);
|
ArgumentNullException.ThrowIfNull(input.UnitData?.HexMessageList);
|
||||||
|
|
||||||
List<string> datas = await AnalysisDataUnitAsync(input.UnitData.HexMessageList);
|
List<string> datas = await AnalysisDataUnitAsync(input.UnitData.HexMessageList);
|
||||||
|
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
||||||
|
|
||||||
AnalysisBaseDto<decimal> data = GenerateFinalResult(datas, "月冻结反向有功最大需量及发生时间");
|
AnalysisBaseDto<decimal?> data = GenerateFinalResult(datas, "月冻结反向有功最大需量及发生时间", dataType);
|
||||||
data.DataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
|
||||||
// 查询电表信息
|
// 查询电表信息
|
||||||
AmmeterInfo ammeterInfo = await _dataStorage.GetMeterInfoAsync(data.DeviceType.ToString(), "15");
|
AmmeterInfo ammeterInfo = await _dataStorage.GetMeterInfoAsync(data.DeviceType.ToString(), "15");
|
||||||
if (ammeterInfo != null)
|
if (ammeterInfo != null)
|
||||||
@ -47,7 +47,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
data.DatabaseBusiID = ammeterInfo.DatabaseBusiID;
|
data.DatabaseBusiID = ammeterInfo.DatabaseBusiID;
|
||||||
data.DeviceAddress = ammeterInfo.AmmerterAddress;
|
data.DeviceAddress = ammeterInfo.AmmerterAddress;
|
||||||
}
|
}
|
||||||
UnitDataAnalysis<AnalysisBaseDto<decimal>> unitDataAnalysis = new UnitDataAnalysis<AnalysisBaseDto<decimal>>
|
UnitDataAnalysis<AnalysisBaseDto<decimal?>> unitDataAnalysis = new UnitDataAnalysis<AnalysisBaseDto<decimal?>>
|
||||||
{
|
{
|
||||||
Code = input.A.Code!,
|
Code = input.A.Code!,
|
||||||
AFN = input.AFN_FC.AFN,
|
AFN = input.AFN_FC.AFN,
|
||||||
@ -62,7 +62,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
DensityUnit = DensityUnit.Month,
|
DensityUnit = DensityUnit.Month,
|
||||||
ReceivedTime = input.ReceivedTime
|
ReceivedTime = input.ReceivedTime
|
||||||
};
|
};
|
||||||
await _dataStorage.SaveDataToIotDbAsync<decimal>(unitDataAnalysis);
|
await _dataStorage.SaveDataToIotDbAsync<decimal?>(unitDataAnalysis);
|
||||||
result?.Invoke(unitDataAnalysis);
|
result?.Invoke(unitDataAnalysis);
|
||||||
return await Task.FromResult(true);
|
return await Task.FromResult(true);
|
||||||
}
|
}
|
||||||
@ -83,13 +83,13 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
int ratingCount = hexMessageList.GetRatingCount(11, 1);
|
int ratingCount = hexMessageList.GetRatingCount(11, 1);
|
||||||
values.Add(ratingCount.ToString());
|
values.Add(ratingCount.ToString());
|
||||||
int handlerNum = 12;
|
int handlerNum = 12;
|
||||||
values.AddRange(await GetDataAsync<decimal>(hexMessageList.GetRange(handlerNum, 3), 3,nameof(Appendix_A23)));//正向有功总最大需量
|
values.AddRange(await GetDataAsync(hexMessageList.GetRange(handlerNum, 3), 3,nameof(Appendix_A23)));//正向有功总最大需量
|
||||||
handlerNum += 3;
|
handlerNum += 3;
|
||||||
values.AddRange(await GetDataAsync<string>(hexMessageList.GetRange(handlerNum, 4), 4, nameof(Appendix_A17)));//正向有功总最大需量发生时间
|
values.AddRange(await GetDataAsync(hexMessageList.GetRange(handlerNum, 4), 4, nameof(Appendix_A17)));//正向有功总最大需量发生时间
|
||||||
return values;
|
return values;
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<List<string>> GetDataAsync<T>(List<string> data, int len, string appendixName)
|
private async Task<List<string>> GetDataAsync(List<string> data, int len, string appendixName)
|
||||||
{
|
{
|
||||||
List<string> values = new List<string>();
|
List<string> values = new List<string>();
|
||||||
var errorCode = data.CheckErrorCode();
|
var errorCode = data.CheckErrorCode();
|
||||||
@ -104,14 +104,12 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
}
|
}
|
||||||
return values;
|
return values;
|
||||||
}
|
}
|
||||||
public AnalysisBaseDto<decimal> GenerateFinalResult(List<string> data, string filedDesc = "")
|
public AnalysisBaseDto<decimal?> GenerateFinalResult(List<string> data, string filedDesc,string dataType)
|
||||||
{
|
{
|
||||||
AnalysisBaseDto<decimal> meter = new AnalysisBaseDto<decimal>
|
AnalysisBaseDto<decimal?> meter = new AnalysisBaseDto<decimal?>
|
||||||
{
|
{
|
||||||
DeviceType = MeterTypeEnum.Ammeter
|
DeviceType = MeterTypeEnum.Ammeter
|
||||||
};
|
};
|
||||||
|
|
||||||
decimal value = 0;
|
|
||||||
var errorCode = data[3].CheckErrorCode();
|
var errorCode = data[3].CheckErrorCode();
|
||||||
if (errorCode != null)
|
if (errorCode != null)
|
||||||
{
|
{
|
||||||
@ -119,15 +117,18 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
meter.ErrorCodeMsg = errorCode.Item2;
|
meter.ErrorCodeMsg = errorCode.Item2;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
decimal.TryParse(data[3], out value);
|
{
|
||||||
|
if(decimal.TryParse(data[3], out decimal value))
|
||||||
|
{
|
||||||
meter.DataValue = value;
|
meter.DataValue = value;
|
||||||
|
}
|
||||||
string timeSpan = $"{data[0].Substring(0, 4)}-{data[4].Substring(0, 2)}-{data[4].Substring(2, 2)} {data[4].Substring(4, 2)}:{data[4].Substring(6, 2)}:00";//$"{data[0].Substring(0, 4)}-{data[0].Substring(4, 2)}-{data[0].Substring(6, 2)}";
|
}
|
||||||
DateTime readingDate = DateTime.Now;
|
string timeSpan = $"{data[0].Substring(0, 4)}-{data[4].Substring(0, 2)}-{data[4].Substring(2, 2)} {data[4].Substring(4, 2)}:{data[4].Substring(6, 2)}:00";
|
||||||
if (DateTime.TryParse(timeSpan, out readingDate))
|
if (DateTime.TryParse(timeSpan, out DateTime readingDate))
|
||||||
{
|
{
|
||||||
meter.TimeSpan = readingDate;
|
meter.TimeSpan = readingDate;
|
||||||
}
|
}
|
||||||
|
meter.DataType = dataType;
|
||||||
meter.FiledDesc = filedDesc;
|
meter.FiledDesc = filedDesc;
|
||||||
meter.FiledName = meter.DataType.GetDataFieldByGatherDataType() ?? string.Empty;
|
meter.FiledName = meter.DataType.GetDataFieldByGatherDataType() ?? string.Empty;
|
||||||
return meter;
|
return meter;
|
||||||
|
|||||||
@ -10,6 +10,7 @@ using System.Data;
|
|||||||
using JiShe.CollectBus.Common.Extensions;
|
using JiShe.CollectBus.Common.Extensions;
|
||||||
using JiShe.CollectBus.IotSystems.Ammeters;
|
using JiShe.CollectBus.IotSystems.Ammeters;
|
||||||
using JiShe.CollectBus.Common.Helpers;
|
using JiShe.CollectBus.Common.Helpers;
|
||||||
|
using YamlDotNet.Core.Tokens;
|
||||||
|
|
||||||
namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
||||||
{
|
{
|
||||||
@ -37,7 +38,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
|
|
||||||
List<string> datas = await AnalysisDataUnitAsync(input.UnitData.HexMessageList);
|
List<string> datas = await AnalysisDataUnitAsync(input.UnitData.HexMessageList);
|
||||||
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
||||||
List<AnalysisBaseDto<decimal>> data = GenerateFinalResult(datas, dataType, "月冻结电能表正向有功最大需量及发生时间");
|
List<AnalysisBaseDto<decimal?>> data = GenerateFinalResult(datas, dataType, "月冻结电能表正向有功最大需量及发生时间");
|
||||||
if (data.Count > 0)
|
if (data.Count > 0)
|
||||||
{
|
{
|
||||||
// 查询电表信息
|
// 查询电表信息
|
||||||
@ -53,7 +54,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
UnitDataAnalysis<List<AnalysisBaseDto<decimal>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal>>>
|
UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>>
|
||||||
{
|
{
|
||||||
Code = input.A.Code!,
|
Code = input.A.Code!,
|
||||||
AFN = input.AFN_FC.AFN,
|
AFN = input.AFN_FC.AFN,
|
||||||
@ -68,7 +69,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
DensityUnit = DensityUnit.Day,
|
DensityUnit = DensityUnit.Day,
|
||||||
ReceivedTime = input.ReceivedTime
|
ReceivedTime = input.ReceivedTime
|
||||||
};
|
};
|
||||||
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal>(unitDataAnalysis);
|
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal?>(unitDataAnalysis);
|
||||||
result?.Invoke(unitDataAnalysis);
|
result?.Invoke(unitDataAnalysis);
|
||||||
return await Task.FromResult(true);
|
return await Task.FromResult(true);
|
||||||
}
|
}
|
||||||
@ -87,18 +88,18 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
int ratingCount = hexMessageList.GetRatingCount(11, 1);
|
int ratingCount = hexMessageList.GetRatingCount(11, 1);
|
||||||
values.Add(ratingCount.ToString());
|
values.Add(ratingCount.ToString());
|
||||||
int handlerNum = 12;
|
int handlerNum = 12;
|
||||||
values.AddRange(await GetDataAsync<decimal>(hexMessageList.GetRange(handlerNum, 3 * (ratingCount + 1)), ratingCount, 3, nameof(Appendix_A23)));//正向有功总最大需量
|
values.AddRange(await GetDataAsync(hexMessageList.GetRange(handlerNum, 3 * (ratingCount + 1)), ratingCount, 3, nameof(Appendix_A23)));//正向有功总最大需量
|
||||||
handlerNum += 3 * (ratingCount + 1);
|
handlerNum += 3 * (ratingCount + 1);
|
||||||
values.AddRange(await GetDataAsync<string>(hexMessageList.GetRange(handlerNum, 4 * (ratingCount + 1)), ratingCount, 4, nameof(Appendix_A17)));//正向有功总最大需量发生时间
|
values.AddRange(await GetDataAsync(hexMessageList.GetRange(handlerNum, 4 * (ratingCount + 1)), ratingCount, 4, nameof(Appendix_A17)));//正向有功总最大需量发生时间
|
||||||
handlerNum += 4 * (ratingCount + 1);
|
handlerNum += 4 * (ratingCount + 1);
|
||||||
values.AddRange(await GetDataAsync<decimal>(hexMessageList.GetRange(handlerNum, 3 * (ratingCount + 1)), ratingCount, 3, nameof(Appendix_A23)));//正向无功总最大需量
|
values.AddRange(await GetDataAsync(hexMessageList.GetRange(handlerNum, 3 * (ratingCount + 1)), ratingCount, 3, nameof(Appendix_A23)));//正向无功总最大需量
|
||||||
handlerNum += 3 * (ratingCount + 1);
|
handlerNum += 3 * (ratingCount + 1);
|
||||||
values.AddRange(await GetDataAsync<string>(hexMessageList.GetRange(handlerNum, 4 * (ratingCount + 1)), ratingCount, 4, nameof(Appendix_A17)));//正向无功总最大需量发生时间
|
values.AddRange(await GetDataAsync(hexMessageList.GetRange(handlerNum, 4 * (ratingCount + 1)), ratingCount, 4, nameof(Appendix_A17)));//正向无功总最大需量发生时间
|
||||||
handlerNum += 4 * (ratingCount + 1);
|
handlerNum += 4 * (ratingCount + 1);
|
||||||
return values;
|
return values;
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<List<string>> GetDataAsync<T>(List<string> data, int ratingCount, int len, string appendixName)
|
private async Task<List<string>> GetDataAsync(List<string> data, int ratingCount, int len, string appendixName)
|
||||||
{
|
{
|
||||||
List<string> values = new List<string>();
|
List<string> values = new List<string>();
|
||||||
for (int i = 0; i < ratingCount + 1; i++)
|
for (int i = 0; i < ratingCount + 1; i++)
|
||||||
@ -118,16 +119,15 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
return values;
|
return values;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<AnalysisBaseDto<decimal>> GenerateFinalResult(List<string> data, string dataType,string filedDesc = "")
|
public List<AnalysisBaseDto<decimal?>> GenerateFinalResult(List<string> data, string dataType,string filedDesc = "")
|
||||||
{
|
{
|
||||||
List<AnalysisBaseDto<decimal>> list = new List<AnalysisBaseDto<decimal>>();
|
List<AnalysisBaseDto<decimal?>> list = new List<AnalysisBaseDto<decimal?>>();
|
||||||
int fCount = Convert.ToInt32(data[2]) + 1;
|
int fCount = Convert.ToInt32(data[2]) + 1;
|
||||||
for (int i = 1; i <= 2; i++)
|
for (int i = 1; i <= 2; i++)
|
||||||
{
|
{
|
||||||
AnalysisBaseDto<decimal> meter = new AnalysisBaseDto<decimal>();
|
AnalysisBaseDto<decimal?> meter = new AnalysisBaseDto<decimal?>();
|
||||||
meter.DeviceType= MeterTypeEnum.Ammeter;
|
meter.DeviceType= MeterTypeEnum.Ammeter;
|
||||||
int startIndex = i == 1 ? 3 : (3 + i * fCount);
|
int startIndex = i == 1 ? 3 : (3 + i * fCount);
|
||||||
decimal value = 0;
|
|
||||||
var errorCode = data[startIndex].CheckErrorCode();
|
var errorCode = data[startIndex].CheckErrorCode();
|
||||||
if (errorCode != null)
|
if (errorCode != null)
|
||||||
{
|
{
|
||||||
@ -135,17 +135,18 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
meter.ErrorCodeMsg = errorCode.Item2;
|
meter.ErrorCodeMsg = errorCode.Item2;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
decimal.TryParse(data[startIndex], out value);
|
{
|
||||||
|
if(decimal.TryParse(data[startIndex], out decimal value))
|
||||||
|
{
|
||||||
meter.DataValue = value;
|
meter.DataValue = value;
|
||||||
//2021 01 15
|
}
|
||||||
|
}
|
||||||
string timeSpan = $"{DateTime.Now.Year}-{data[startIndex + fCount].Substring(0, 2)}-{data[startIndex + fCount].Substring(2, 2)} {data[startIndex + fCount].Substring(4, 2)}:{data[startIndex + fCount].Substring(6, 2)}:00";
|
string timeSpan = $"{DateTime.Now.Year}-{data[startIndex + fCount].Substring(0, 2)}-{data[startIndex + fCount].Substring(2, 2)} {data[startIndex + fCount].Substring(4, 2)}:{data[startIndex + fCount].Substring(6, 2)}:00";
|
||||||
DateTime readingDate = DateTime.Now;
|
if (DateTime.TryParse(timeSpan, out DateTime readingDate))
|
||||||
if (DateTime.TryParse(timeSpan, out readingDate))
|
|
||||||
{
|
{
|
||||||
meter.TimeSpan = readingDate;
|
meter.TimeSpan = readingDate;
|
||||||
}
|
}
|
||||||
meter.DataType = i == 1 ? dataType : $"{dataType}_{ i - 1}";
|
meter.DataType = i == 1 ? dataType : $"{dataType}_{ i - 1}";
|
||||||
|
|
||||||
filedDesc = i == 1 ? filedDesc : filedDesc.Replace("有功", "无功");
|
filedDesc = i == 1 ? filedDesc : filedDesc.Replace("有功", "无功");
|
||||||
meter.FiledDesc = filedDesc;
|
meter.FiledDesc = filedDesc;
|
||||||
meter.FiledName = meter.DataType.GetDataFieldByGatherDataType() ?? string.Empty;
|
meter.FiledName = meter.DataType.GetDataFieldByGatherDataType() ?? string.Empty;
|
||||||
|
|||||||
@ -41,7 +41,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
//冻结数据时标
|
//冻结数据时标
|
||||||
var time = $"{datas[0].Substring(0, 4)}-{datas[0].Substring(4, 2)}-{datas[0].Substring(6, 2)} 00:00:00";
|
var time = $"{datas[0].Substring(0, 4)}-{datas[0].Substring(4, 2)}-{datas[0].Substring(6, 2)} 00:00:00";
|
||||||
|
|
||||||
List<AnalysisBaseDto<decimal>> data = GenerateFinalResult(datas,dataType, "日冻结正向有/无功最大需量及发生时间");
|
List<AnalysisBaseDto<decimal?>> data = GenerateFinalResult(datas,dataType, "日冻结正向有/无功最大需量及发生时间");
|
||||||
if (data.Count > 0)
|
if (data.Count > 0)
|
||||||
{
|
{
|
||||||
// 查询电表信息
|
// 查询电表信息
|
||||||
@ -57,7 +57,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
UnitDataAnalysis<List<AnalysisBaseDto<decimal>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal>>>
|
UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>>
|
||||||
{
|
{
|
||||||
Code = input.A.Code!,
|
Code = input.A.Code!,
|
||||||
AFN = input.AFN_FC.AFN,
|
AFN = input.AFN_FC.AFN,
|
||||||
@ -72,7 +72,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
DensityUnit = DensityUnit.Day,
|
DensityUnit = DensityUnit.Day,
|
||||||
ReceivedTime = input.ReceivedTime
|
ReceivedTime = input.ReceivedTime
|
||||||
};
|
};
|
||||||
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal>(unitDataAnalysis);
|
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal?>(unitDataAnalysis);
|
||||||
result?.Invoke(unitDataAnalysis);
|
result?.Invoke(unitDataAnalysis);
|
||||||
return await Task.FromResult(true);
|
return await Task.FromResult(true);
|
||||||
}
|
}
|
||||||
@ -92,18 +92,18 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
int ratingCount = hexMessageList.GetRatingCount(12, 1);//费率数 M(1≤M≤12)
|
int ratingCount = hexMessageList.GetRatingCount(12, 1);//费率数 M(1≤M≤12)
|
||||||
values.Add(ratingCount.ToString());
|
values.Add(ratingCount.ToString());
|
||||||
int handlerNum = 13;
|
int handlerNum = 13;
|
||||||
values.AddRange(await GetDataAsync<decimal>(hexMessageList.GetRange(handlerNum, 3 * (ratingCount + 1)), ratingCount, 3, nameof(Appendix_A23)));//正向有功总最大需量
|
values.AddRange(await GetDataAsync(hexMessageList.GetRange(handlerNum, 3 * (ratingCount + 1)), ratingCount, 3, nameof(Appendix_A23)));//正向有功总最大需量
|
||||||
handlerNum += 3 * (ratingCount + 1);//12
|
handlerNum += 3 * (ratingCount + 1);//12
|
||||||
values.AddRange(await GetDataAsync<string>(hexMessageList.GetRange(handlerNum, 4 * (ratingCount + 1)), ratingCount, 4, nameof(Appendix_A17)));//正向有功总最大需量发生时间
|
values.AddRange(await GetDataAsync(hexMessageList.GetRange(handlerNum, 4 * (ratingCount + 1)), ratingCount, 4, nameof(Appendix_A17)));//正向有功总最大需量发生时间
|
||||||
handlerNum += 4 * (ratingCount + 1);//28
|
handlerNum += 4 * (ratingCount + 1);//28
|
||||||
values.AddRange(await GetDataAsync<decimal>(hexMessageList.GetRange(handlerNum, 3 * (ratingCount + 1)), ratingCount, 3, nameof(Appendix_A23)));//正向无功总最大需量
|
values.AddRange(await GetDataAsync(hexMessageList.GetRange(handlerNum, 3 * (ratingCount + 1)), ratingCount, 3, nameof(Appendix_A23)));//正向无功总最大需量
|
||||||
handlerNum += 3 * (ratingCount + 1);//48
|
handlerNum += 3 * (ratingCount + 1);//48
|
||||||
values.AddRange(await GetDataAsync<string>(hexMessageList.GetRange(handlerNum, 4 * (ratingCount + 1)), ratingCount, 4, nameof(Appendix_A17)));//正向无功总最大需量发生时间
|
values.AddRange(await GetDataAsync(hexMessageList.GetRange(handlerNum, 4 * (ratingCount + 1)), ratingCount, 4, nameof(Appendix_A17)));//正向无功总最大需量发生时间
|
||||||
handlerNum += 4 * (ratingCount + 1);
|
handlerNum += 4 * (ratingCount + 1);
|
||||||
return values;
|
return values;
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<List<string>> GetDataAsync<T>(List<string> data, int ratingCount, int len, string appendixName)
|
private async Task<List<string>> GetDataAsync(List<string> data, int ratingCount, int len, string appendixName)
|
||||||
{
|
{
|
||||||
List<string> values = new List<string>();
|
List<string> values = new List<string>();
|
||||||
for (int i = 0; i < ratingCount + 1; i++)
|
for (int i = 0; i < ratingCount + 1; i++)
|
||||||
@ -123,15 +123,13 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
return values;
|
return values;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<AnalysisBaseDto<decimal>> GenerateFinalResult(List<string> data,string dataType, string filedDesc = "")
|
public List<AnalysisBaseDto<decimal?>> GenerateFinalResult(List<string> data,string dataType, string filedDesc = "")
|
||||||
{
|
{
|
||||||
List<AnalysisBaseDto<decimal>> list = new List<AnalysisBaseDto<decimal>>();
|
List<AnalysisBaseDto<decimal?>> list = new List<AnalysisBaseDto<decimal?>>();
|
||||||
int fCount = Convert.ToInt32(data[2]) + 1;
|
int fCount = Convert.ToInt32(data[2]) + 1;
|
||||||
for (int i = 1; i <= 2; i++)
|
for (int i = 1; i <= 2; i++)
|
||||||
{
|
{
|
||||||
try
|
AnalysisBaseDto<decimal?> meter = new AnalysisBaseDto<decimal?>
|
||||||
{
|
|
||||||
AnalysisBaseDto<decimal> meter = new AnalysisBaseDto<decimal>
|
|
||||||
{
|
{
|
||||||
DeviceType = MeterTypeEnum.Ammeter
|
DeviceType = MeterTypeEnum.Ammeter
|
||||||
};
|
};
|
||||||
@ -140,18 +138,18 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
var errorCode = data[startIndex].CheckErrorCode();
|
var errorCode = data[startIndex].CheckErrorCode();
|
||||||
if (errorCode != null)
|
if (errorCode != null)
|
||||||
meter.ValidData = false;
|
meter.ValidData = false;
|
||||||
decimal.TryParse(data[startIndex], out decimal value);//decimal.TryParse(data[startIndex], out value);
|
if(decimal.TryParse(data[startIndex], out decimal value))
|
||||||
meter.DataValue = value;
|
meter.DataValue = value;
|
||||||
|
|
||||||
//TODO:日冻结类数据时标Td 20210824
|
//TODO:日冻结类数据时标Td
|
||||||
var dataTime = string.Empty;
|
var dataTime = string.Empty;
|
||||||
errorCode = data[0].CheckErrorCode();
|
errorCode = data[0].CheckErrorCode();
|
||||||
if (data[0].Length == 8 && errorCode is null)
|
if (data[0].Length == 8 && errorCode is null)
|
||||||
dataTime = $"{data[0].Substring(0, 4)}-{data[0].Substring(4, 2)}-{data[0].Substring(6, 2)} 00:00:00";
|
dataTime = $"{data[0].Substring(0, 4)}-{data[0].Substring(4, 2)}-{data[0].Substring(6, 2)} 00:00:00";
|
||||||
if (!DateTime.TryParse(dataTime, out DateTime readingDate))
|
if (DateTime.TryParse(dataTime, out DateTime readingDate))
|
||||||
|
meter.TimeSpan = readingDate;
|
||||||
|
else
|
||||||
meter.ValidData = false;
|
meter.ValidData = false;
|
||||||
meter.TimeSpan = readingDate;//
|
|
||||||
|
|
||||||
//TODO:最大需量发生时间
|
//TODO:最大需量发生时间
|
||||||
errorCode = data[startIndex + fCount].CheckErrorCode();
|
errorCode = data[startIndex + fCount].CheckErrorCode();
|
||||||
if (errorCode != null && data[startIndex + fCount].Length != 8)
|
if (errorCode != null && data[startIndex + fCount].Length != 8)
|
||||||
@ -164,20 +162,13 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
else
|
else
|
||||||
meter.TimeSpan=tsField;
|
meter.TimeSpan=tsField;
|
||||||
}
|
}
|
||||||
|
|
||||||
meter.DataType = i == 1 ? dataType : $"{dataType}_{ i - 1}";
|
meter.DataType = i == 1 ? dataType : $"{dataType}_{ i - 1}";
|
||||||
filedDesc = i == 1 ? filedDesc : filedDesc.Replace("有功", "无功");
|
filedDesc = i == 1 ? filedDesc : filedDesc.Replace("有功", "无功");
|
||||||
meter.FiledDesc = filedDesc;
|
meter.FiledDesc = filedDesc;
|
||||||
meter.FiledName = meter.DataType.GetDataFieldByGatherDataType() ?? string.Empty;
|
meter.FiledName = meter.DataType.GetDataFieldByGatherDataType() ?? string.Empty;
|
||||||
list.Add(meter);
|
list.Add(meter);
|
||||||
}
|
|
||||||
catch
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (list.Count == 0)
|
|
||||||
throw new Exception("错误数据");
|
|
||||||
|
|
||||||
|
}
|
||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -40,7 +40,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
//冻结数据时标
|
//冻结数据时标
|
||||||
var time = $"{datas[0].Substring(0, 4)}-{datas[0].Substring(4, 2)}-{datas[0].Substring(6, 2)} 00:00:00";
|
var time = $"{datas[0].Substring(0, 4)}-{datas[0].Substring(4, 2)}-{datas[0].Substring(6, 2)} 00:00:00";
|
||||||
|
|
||||||
List<AnalysisBaseDto<decimal>> data = GenerateFinalResult(datas, dataType, "日冻结反向有/无功最大需量及发生时间");
|
List<AnalysisBaseDto<decimal?>> data = GenerateFinalResult(datas, dataType, "日冻结反向有/无功最大需量及发生时间");
|
||||||
if (data.Count > 0)
|
if (data.Count > 0)
|
||||||
{
|
{
|
||||||
// 查询电表信息
|
// 查询电表信息
|
||||||
@ -56,7 +56,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
UnitDataAnalysis<List<AnalysisBaseDto<decimal>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal>>>
|
UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>>
|
||||||
{
|
{
|
||||||
Code = input.A.Code!,
|
Code = input.A.Code!,
|
||||||
AFN = input.AFN_FC.AFN,
|
AFN = input.AFN_FC.AFN,
|
||||||
@ -71,7 +71,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
DensityUnit = DensityUnit.Day,
|
DensityUnit = DensityUnit.Day,
|
||||||
ReceivedTime = input.ReceivedTime
|
ReceivedTime = input.ReceivedTime
|
||||||
};
|
};
|
||||||
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal>(unitDataAnalysis);
|
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal?>(unitDataAnalysis);
|
||||||
result?.Invoke(unitDataAnalysis);
|
result?.Invoke(unitDataAnalysis);
|
||||||
return await Task.FromResult(true);
|
return await Task.FromResult(true);
|
||||||
}
|
}
|
||||||
@ -91,18 +91,18 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
int ratingCount = hexMessageList.GetRatingCount(12, 1);//费率数 M(1≤M≤12)
|
int ratingCount = hexMessageList.GetRatingCount(12, 1);//费率数 M(1≤M≤12)
|
||||||
values.Add(ratingCount.ToString());
|
values.Add(ratingCount.ToString());
|
||||||
int handlerNum = 13;
|
int handlerNum = 13;
|
||||||
values.AddRange(await GetDataAsync<decimal>(hexMessageList.GetRange(handlerNum, 3 * (ratingCount + 1)), ratingCount, 3, nameof(Appendix_A23)));//正向有功总最大需量
|
values.AddRange(await GetDataAsync(hexMessageList.GetRange(handlerNum, 3 * (ratingCount + 1)), ratingCount, 3, nameof(Appendix_A23)));//正向有功总最大需量
|
||||||
handlerNum += 3 * (ratingCount + 1);//12
|
handlerNum += 3 * (ratingCount + 1);//12
|
||||||
values.AddRange(await GetDataAsync<string>(hexMessageList.GetRange(handlerNum, 4 * (ratingCount + 1)), ratingCount, 4, nameof(Appendix_A17)));//正向有功总最大需量发生时间
|
values.AddRange(await GetDataAsync(hexMessageList.GetRange(handlerNum, 4 * (ratingCount + 1)), ratingCount, 4, nameof(Appendix_A17)));//正向有功总最大需量发生时间
|
||||||
handlerNum += 4 * (ratingCount + 1);//28
|
handlerNum += 4 * (ratingCount + 1);//28
|
||||||
values.AddRange(await GetDataAsync<decimal>(hexMessageList.GetRange(handlerNum, 3 * (ratingCount + 1)), ratingCount, 3, nameof(Appendix_A23)));//正向无功总最大需量
|
values.AddRange(await GetDataAsync(hexMessageList.GetRange(handlerNum, 3 * (ratingCount + 1)), ratingCount, 3, nameof(Appendix_A23)));//正向无功总最大需量
|
||||||
handlerNum += 3 * (ratingCount + 1);//48
|
handlerNum += 3 * (ratingCount + 1);//48
|
||||||
values.AddRange(await GetDataAsync<string>(hexMessageList.GetRange(handlerNum, 4 * (ratingCount + 1)), ratingCount, 4, nameof(Appendix_A17)));//正向无功总最大需量发生时间
|
values.AddRange(await GetDataAsync(hexMessageList.GetRange(handlerNum, 4 * (ratingCount + 1)), ratingCount, 4, nameof(Appendix_A17)));//正向无功总最大需量发生时间
|
||||||
handlerNum += 4 * (ratingCount + 1);
|
handlerNum += 4 * (ratingCount + 1);
|
||||||
return values;
|
return values;
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<List<string>> GetDataAsync<T>(List<string> data, int ratingCount, int len, string appendixName)
|
private async Task<List<string>> GetDataAsync(List<string> data, int ratingCount, int len, string appendixName)
|
||||||
{
|
{
|
||||||
List<string> values = new List<string>();
|
List<string> values = new List<string>();
|
||||||
for (int i = 0; i < ratingCount + 1; i++)
|
for (int i = 0; i < ratingCount + 1; i++)
|
||||||
@ -122,13 +122,13 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
return values;
|
return values;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<AnalysisBaseDto<decimal>> GenerateFinalResult(List<string> data,string dataType, string filedDesc = "")
|
public List<AnalysisBaseDto<decimal?>> GenerateFinalResult(List<string> data,string dataType, string filedDesc = "")
|
||||||
{
|
{
|
||||||
List<AnalysisBaseDto<decimal>> list = new List<AnalysisBaseDto<decimal>>();
|
List<AnalysisBaseDto<decimal?>> list = new List<AnalysisBaseDto<decimal?>>();
|
||||||
int fCount = Convert.ToInt32(data[2]) + 1;
|
int fCount = Convert.ToInt32(data[2]) + 1;
|
||||||
for (int i = 1; i <= 2; i++)
|
for (int i = 1; i <= 2; i++)
|
||||||
{
|
{
|
||||||
AnalysisBaseDto<decimal> meter = new AnalysisBaseDto<decimal>
|
AnalysisBaseDto<decimal?> meter = new AnalysisBaseDto<decimal?>
|
||||||
{
|
{
|
||||||
DeviceType = MeterTypeEnum.Ammeter
|
DeviceType = MeterTypeEnum.Ammeter
|
||||||
};
|
};
|
||||||
@ -140,16 +140,16 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
meter.ValidData = false;
|
meter.ValidData = false;
|
||||||
meter.ErrorCodeMsg = errorCode.Item2;
|
meter.ErrorCodeMsg = errorCode.Item2;
|
||||||
}
|
}
|
||||||
decimal.TryParse(data[startIndex], out decimal value);//decimal.TryParse(data[startIndex], out value);
|
if(decimal.TryParse(data[startIndex], out decimal value))
|
||||||
meter.DataValue = value;
|
meter.DataValue = value;
|
||||||
|
//TODO:日冻结类数据时标Td
|
||||||
//TODO:日冻结类数据时标Td 20210824
|
|
||||||
var dataTime = string.Empty;
|
var dataTime = string.Empty;
|
||||||
errorCode = data[0].CheckErrorCode();
|
errorCode = data[0].CheckErrorCode();
|
||||||
if (data[0].Length == 8 && errorCode is null)
|
if (data[0].Length == 8 && errorCode is null)
|
||||||
dataTime = $"{data[0].Substring(0, 4)}-{data[0].Substring(4, 2)}-{data[0].Substring(6, 2)} 00:00:00";
|
dataTime = $"{data[0].Substring(0, 4)}-{data[0].Substring(4, 2)}-{data[0].Substring(6, 2)} 00:00:00";
|
||||||
if (!DateTime.TryParse(dataTime, out DateTime readingDate))
|
if (!DateTime.TryParse(dataTime, out DateTime readingDate))
|
||||||
meter.ValidData = false;
|
meter.ValidData = false;
|
||||||
|
else
|
||||||
meter.TimeSpan = readingDate;
|
meter.TimeSpan = readingDate;
|
||||||
|
|
||||||
//TODO:最大需量发生时间
|
//TODO:最大需量发生时间
|
||||||
@ -169,7 +169,6 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
meter.FiledDesc = filedDesc;
|
meter.FiledDesc = filedDesc;
|
||||||
meter.FiledName = meter.DataType.GetDataFieldByGatherDataType() ?? string.Empty;
|
meter.FiledName = meter.DataType.GetDataFieldByGatherDataType() ?? string.Empty;
|
||||||
list.Add(meter);
|
list.Add(meter);
|
||||||
|
|
||||||
}
|
}
|
||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -38,7 +38,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
int density = Convert.ToInt32(Convert.ToInt32(datas[1]).GetEnumDescription(typeof(DensityEnums)));
|
int density = Convert.ToInt32(Convert.ToInt32(datas[1]).GetEnumDescription(typeof(DensityEnums)));
|
||||||
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
||||||
|
|
||||||
List<AnalysisBaseDto<decimal>> data = datas.GenerateFinalResultTd_c(3, density, dataType, "有功功率曲线");
|
List<AnalysisBaseDto<decimal?>> data = datas.GenerateFinalResultTd_c(3, density, dataType, "有功功率曲线");
|
||||||
if (data.Count > 0)
|
if (data.Count > 0)
|
||||||
{
|
{
|
||||||
// 查询电表信息
|
// 查询电表信息
|
||||||
@ -54,7 +54,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
UnitDataAnalysis<List<AnalysisBaseDto<decimal>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal>>>
|
UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>>
|
||||||
{
|
{
|
||||||
Code = input.A.Code!,
|
Code = input.A.Code!,
|
||||||
AFN = input.AFN_FC.AFN,
|
AFN = input.AFN_FC.AFN,
|
||||||
@ -69,7 +69,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
DensityUnit = DensityUnit.Minute,
|
DensityUnit = DensityUnit.Minute,
|
||||||
ReceivedTime = input.ReceivedTime
|
ReceivedTime = input.ReceivedTime
|
||||||
};
|
};
|
||||||
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal>(unitDataAnalysis);
|
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal?>(unitDataAnalysis);
|
||||||
result?.Invoke(unitDataAnalysis);
|
result?.Invoke(unitDataAnalysis);
|
||||||
return await Task.FromResult(true);
|
return await Task.FromResult(true);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -39,7 +39,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
int density = Convert.ToInt32(Convert.ToInt32(datas[1]).GetEnumDescription(typeof(DensityEnums)));
|
int density = Convert.ToInt32(Convert.ToInt32(datas[1]).GetEnumDescription(typeof(DensityEnums)));
|
||||||
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
||||||
|
|
||||||
List<AnalysisBaseDto<decimal>> data = datas.GenerateFinalResultTd_c(3, density, dataType, "A相有功功率曲线");
|
List<AnalysisBaseDto<decimal?>> data = datas.GenerateFinalResultTd_c(3, density, dataType, "A相有功功率曲线");
|
||||||
if (data.Count > 0)
|
if (data.Count > 0)
|
||||||
{
|
{
|
||||||
// 查询电表信息
|
// 查询电表信息
|
||||||
@ -55,7 +55,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
UnitDataAnalysis<List<AnalysisBaseDto<decimal>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal>>>
|
UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>>
|
||||||
{
|
{
|
||||||
Code = input.A.Code!,
|
Code = input.A.Code!,
|
||||||
AFN = input.AFN_FC.AFN,
|
AFN = input.AFN_FC.AFN,
|
||||||
@ -70,7 +70,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
DensityUnit = DensityUnit.Minute,
|
DensityUnit = DensityUnit.Minute,
|
||||||
ReceivedTime = input.ReceivedTime
|
ReceivedTime = input.ReceivedTime
|
||||||
};
|
};
|
||||||
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal>(unitDataAnalysis);
|
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal?>(unitDataAnalysis);
|
||||||
result?.Invoke(unitDataAnalysis);
|
result?.Invoke(unitDataAnalysis);
|
||||||
return await Task.FromResult(true);
|
return await Task.FromResult(true);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -39,7 +39,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
int density = Convert.ToInt32(Convert.ToInt32(datas[1]).GetEnumDescription(typeof(DensityEnums)));
|
int density = Convert.ToInt32(Convert.ToInt32(datas[1]).GetEnumDescription(typeof(DensityEnums)));
|
||||||
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
||||||
|
|
||||||
List<AnalysisBaseDto<decimal>> data = datas.GenerateFinalResultTd_c(3, density, dataType, "B相有功功率曲线");
|
List<AnalysisBaseDto<decimal?>> data = datas.GenerateFinalResultTd_c(3, density, dataType, "B相有功功率曲线");
|
||||||
if (data.Count > 0)
|
if (data.Count > 0)
|
||||||
{
|
{
|
||||||
// 查询电表信息
|
// 查询电表信息
|
||||||
@ -55,7 +55,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
UnitDataAnalysis<List<AnalysisBaseDto<decimal>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal>>>
|
UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>>
|
||||||
{
|
{
|
||||||
Code = input.A.Code!,
|
Code = input.A.Code!,
|
||||||
AFN = input.AFN_FC.AFN,
|
AFN = input.AFN_FC.AFN,
|
||||||
@ -70,7 +70,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
DensityUnit = DensityUnit.Minute,
|
DensityUnit = DensityUnit.Minute,
|
||||||
ReceivedTime = input.ReceivedTime
|
ReceivedTime = input.ReceivedTime
|
||||||
};
|
};
|
||||||
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal>(unitDataAnalysis);
|
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal?>(unitDataAnalysis);
|
||||||
result?.Invoke(unitDataAnalysis);
|
result?.Invoke(unitDataAnalysis);
|
||||||
return await Task.FromResult(true);
|
return await Task.FromResult(true);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -38,7 +38,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
int density = Convert.ToInt32(Convert.ToInt32(datas[1]).GetEnumDescription(typeof(DensityEnums)));
|
int density = Convert.ToInt32(Convert.ToInt32(datas[1]).GetEnumDescription(typeof(DensityEnums)));
|
||||||
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
||||||
|
|
||||||
List<AnalysisBaseDto<decimal>> data = datas.GenerateFinalResultTd_c(3, density, dataType, "C相有功功率曲线");
|
List<AnalysisBaseDto<decimal?>> data = datas.GenerateFinalResultTd_c(3, density, dataType, "C相有功功率曲线");
|
||||||
if (data.Count > 0)
|
if (data.Count > 0)
|
||||||
{
|
{
|
||||||
// 查询电表信息
|
// 查询电表信息
|
||||||
@ -54,7 +54,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
UnitDataAnalysis<List<AnalysisBaseDto<decimal>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal>>>
|
UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>>
|
||||||
{
|
{
|
||||||
Code = input.A.Code!,
|
Code = input.A.Code!,
|
||||||
AFN = input.AFN_FC.AFN,
|
AFN = input.AFN_FC.AFN,
|
||||||
@ -69,7 +69,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
DensityUnit = DensityUnit.Minute,
|
DensityUnit = DensityUnit.Minute,
|
||||||
ReceivedTime = input.ReceivedTime
|
ReceivedTime = input.ReceivedTime
|
||||||
};
|
};
|
||||||
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal>(unitDataAnalysis);
|
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal?>(unitDataAnalysis);
|
||||||
result?.Invoke(unitDataAnalysis);
|
result?.Invoke(unitDataAnalysis);
|
||||||
return await Task.FromResult(true);
|
return await Task.FromResult(true);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -39,7 +39,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
int density = Convert.ToInt32(Convert.ToInt32(datas[1]).GetEnumDescription(typeof(DensityEnums)));
|
int density = Convert.ToInt32(Convert.ToInt32(datas[1]).GetEnumDescription(typeof(DensityEnums)));
|
||||||
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
||||||
|
|
||||||
List<AnalysisBaseDto<decimal>> data = datas.GenerateFinalResultTd_c(3, density, dataType, "无功功率曲线");
|
List<AnalysisBaseDto<decimal?>> data = datas.GenerateFinalResultTd_c(3, density, dataType, "无功功率曲线");
|
||||||
if (data.Count > 0)
|
if (data.Count > 0)
|
||||||
{
|
{
|
||||||
// 查询电表信息
|
// 查询电表信息
|
||||||
@ -55,7 +55,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
UnitDataAnalysis<List<AnalysisBaseDto<decimal>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal>>>
|
UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>>
|
||||||
{
|
{
|
||||||
Code = input.A.Code!,
|
Code = input.A.Code!,
|
||||||
AFN = input.AFN_FC.AFN,
|
AFN = input.AFN_FC.AFN,
|
||||||
@ -70,7 +70,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
DensityUnit = DensityUnit.Minute,
|
DensityUnit = DensityUnit.Minute,
|
||||||
ReceivedTime = input.ReceivedTime
|
ReceivedTime = input.ReceivedTime
|
||||||
};
|
};
|
||||||
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal>(unitDataAnalysis);
|
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal?>(unitDataAnalysis);
|
||||||
result?.Invoke(unitDataAnalysis);
|
result?.Invoke(unitDataAnalysis);
|
||||||
return await Task.FromResult(true);
|
return await Task.FromResult(true);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -39,7 +39,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
int density = Convert.ToInt32(Convert.ToInt32(datas[1]).GetEnumDescription(typeof(DensityEnums)));
|
int density = Convert.ToInt32(Convert.ToInt32(datas[1]).GetEnumDescription(typeof(DensityEnums)));
|
||||||
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
||||||
|
|
||||||
List<AnalysisBaseDto<decimal>> data = datas.GenerateFinalResultTd_c(3, density, dataType, "A相无功功率曲线");
|
List<AnalysisBaseDto<decimal?>> data = datas.GenerateFinalResultTd_c(3, density, dataType, "A相无功功率曲线");
|
||||||
if (data.Count > 0)
|
if (data.Count > 0)
|
||||||
{
|
{
|
||||||
// 查询电表信息
|
// 查询电表信息
|
||||||
@ -55,7 +55,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
UnitDataAnalysis<List<AnalysisBaseDto<decimal>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal>>>
|
UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>>
|
||||||
{
|
{
|
||||||
Code = input.A.Code!,
|
Code = input.A.Code!,
|
||||||
AFN = input.AFN_FC.AFN,
|
AFN = input.AFN_FC.AFN,
|
||||||
@ -70,7 +70,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
DensityUnit = DensityUnit.Minute,
|
DensityUnit = DensityUnit.Minute,
|
||||||
ReceivedTime = input.ReceivedTime
|
ReceivedTime = input.ReceivedTime
|
||||||
};
|
};
|
||||||
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal>(unitDataAnalysis);
|
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal?>(unitDataAnalysis);
|
||||||
result?.Invoke(unitDataAnalysis);
|
result?.Invoke(unitDataAnalysis);
|
||||||
return await Task.FromResult(true);
|
return await Task.FromResult(true);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -38,7 +38,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
int density = Convert.ToInt32(Convert.ToInt32(datas[1]).GetEnumDescription(typeof(DensityEnums)));
|
int density = Convert.ToInt32(Convert.ToInt32(datas[1]).GetEnumDescription(typeof(DensityEnums)));
|
||||||
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
||||||
|
|
||||||
List<AnalysisBaseDto<decimal>> data = datas.GenerateFinalResultTd_c(3, density, dataType, "B相无功功率曲线");
|
List<AnalysisBaseDto<decimal?>> data = datas.GenerateFinalResultTd_c(3, density, dataType, "B相无功功率曲线");
|
||||||
if (data.Count > 0)
|
if (data.Count > 0)
|
||||||
{
|
{
|
||||||
// 查询电表信息
|
// 查询电表信息
|
||||||
@ -54,7 +54,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
UnitDataAnalysis<List<AnalysisBaseDto<decimal>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal>>>
|
UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>>
|
||||||
{
|
{
|
||||||
Code = input.A.Code!,
|
Code = input.A.Code!,
|
||||||
AFN = input.AFN_FC.AFN,
|
AFN = input.AFN_FC.AFN,
|
||||||
@ -69,7 +69,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
DensityUnit = DensityUnit.Minute,
|
DensityUnit = DensityUnit.Minute,
|
||||||
ReceivedTime = input.ReceivedTime
|
ReceivedTime = input.ReceivedTime
|
||||||
};
|
};
|
||||||
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal>(unitDataAnalysis);
|
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal?>(unitDataAnalysis);
|
||||||
result?.Invoke(unitDataAnalysis);
|
result?.Invoke(unitDataAnalysis);
|
||||||
return await Task.FromResult(true);
|
return await Task.FromResult(true);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -39,7 +39,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
int density = Convert.ToInt32(Convert.ToInt32(datas[1]).GetEnumDescription(typeof(DensityEnums)));
|
int density = Convert.ToInt32(Convert.ToInt32(datas[1]).GetEnumDescription(typeof(DensityEnums)));
|
||||||
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
||||||
|
|
||||||
List<AnalysisBaseDto<decimal>> data = datas.GenerateFinalResultTd_c(3, density, dataType, "C相无功功率曲线");
|
List<AnalysisBaseDto<decimal?>> data = datas.GenerateFinalResultTd_c(3, density, dataType, "C相无功功率曲线");
|
||||||
if (data.Count > 0)
|
if (data.Count > 0)
|
||||||
{
|
{
|
||||||
// 查询电表信息
|
// 查询电表信息
|
||||||
@ -55,7 +55,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
UnitDataAnalysis<List<AnalysisBaseDto<decimal>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal>>>
|
UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>>
|
||||||
{
|
{
|
||||||
Code = input.A.Code!,
|
Code = input.A.Code!,
|
||||||
AFN = input.AFN_FC.AFN,
|
AFN = input.AFN_FC.AFN,
|
||||||
@ -70,7 +70,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
DensityUnit = DensityUnit.Minute,
|
DensityUnit = DensityUnit.Minute,
|
||||||
ReceivedTime = input.ReceivedTime
|
ReceivedTime = input.ReceivedTime
|
||||||
};
|
};
|
||||||
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal>(unitDataAnalysis);
|
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal?>(unitDataAnalysis);
|
||||||
result?.Invoke(unitDataAnalysis);
|
result?.Invoke(unitDataAnalysis);
|
||||||
return await Task.FromResult(true);
|
return await Task.FromResult(true);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -39,7 +39,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
int density = Convert.ToInt32(Convert.ToInt32(datas[1]).GetEnumDescription(typeof(DensityEnums)));
|
int density = Convert.ToInt32(Convert.ToInt32(datas[1]).GetEnumDescription(typeof(DensityEnums)));
|
||||||
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
||||||
|
|
||||||
List<AnalysisBaseDto<decimal>> data = datas.GenerateFinalResultTd_c(3, density, dataType, "A相电压曲线");
|
List<AnalysisBaseDto<decimal?>> data = datas.GenerateFinalResultTd_c(3, density, dataType, "A相电压曲线");
|
||||||
if (data.Count > 0)
|
if (data.Count > 0)
|
||||||
{
|
{
|
||||||
// 查询电表信息
|
// 查询电表信息
|
||||||
@ -55,7 +55,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
UnitDataAnalysis<List<AnalysisBaseDto<decimal>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal>>>
|
UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>>
|
||||||
{
|
{
|
||||||
Code = input.A.Code!,
|
Code = input.A.Code!,
|
||||||
AFN = input.AFN_FC.AFN,
|
AFN = input.AFN_FC.AFN,
|
||||||
@ -70,7 +70,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
DensityUnit = DensityUnit.Minute,
|
DensityUnit = DensityUnit.Minute,
|
||||||
ReceivedTime = input.ReceivedTime
|
ReceivedTime = input.ReceivedTime
|
||||||
};
|
};
|
||||||
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal>(unitDataAnalysis);
|
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal?>(unitDataAnalysis);
|
||||||
result?.Invoke(unitDataAnalysis);
|
result?.Invoke(unitDataAnalysis);
|
||||||
return await Task.FromResult(true);
|
return await Task.FromResult(true);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -39,7 +39,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
int density = Convert.ToInt32(Convert.ToInt32(datas[1]).GetEnumDescription(typeof(DensityEnums)));
|
int density = Convert.ToInt32(Convert.ToInt32(datas[1]).GetEnumDescription(typeof(DensityEnums)));
|
||||||
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
||||||
|
|
||||||
List<AnalysisBaseDto<decimal>> data = datas.GenerateFinalResultTd_c(3, density, dataType, "B相电压曲线");
|
List<AnalysisBaseDto<decimal?>> data = datas.GenerateFinalResultTd_c(3, density, dataType, "B相电压曲线");
|
||||||
if (data.Count > 0)
|
if (data.Count > 0)
|
||||||
{
|
{
|
||||||
// 查询电表信息
|
// 查询电表信息
|
||||||
@ -55,7 +55,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
UnitDataAnalysis<List<AnalysisBaseDto<decimal>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal>>>
|
UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>>
|
||||||
{
|
{
|
||||||
Code = input.A.Code!,
|
Code = input.A.Code!,
|
||||||
AFN = input.AFN_FC.AFN,
|
AFN = input.AFN_FC.AFN,
|
||||||
@ -70,7 +70,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
DensityUnit = DensityUnit.Minute,
|
DensityUnit = DensityUnit.Minute,
|
||||||
ReceivedTime = input.ReceivedTime
|
ReceivedTime = input.ReceivedTime
|
||||||
};
|
};
|
||||||
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal>(unitDataAnalysis);
|
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal?>(unitDataAnalysis);
|
||||||
result?.Invoke(unitDataAnalysis);
|
result?.Invoke(unitDataAnalysis);
|
||||||
return await Task.FromResult(true);
|
return await Task.FromResult(true);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -38,7 +38,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
int density = Convert.ToInt32(Convert.ToInt32(datas[1]).GetEnumDescription(typeof(DensityEnums)));
|
int density = Convert.ToInt32(Convert.ToInt32(datas[1]).GetEnumDescription(typeof(DensityEnums)));
|
||||||
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
||||||
|
|
||||||
List<AnalysisBaseDto<decimal>> data = datas.GenerateFinalResultTd_c(3, density, dataType, "C相电压曲线");
|
List<AnalysisBaseDto<decimal?>> data = datas.GenerateFinalResultTd_c(3, density, dataType, "C相电压曲线");
|
||||||
if (data.Count > 0)
|
if (data.Count > 0)
|
||||||
{
|
{
|
||||||
// 查询电表信息
|
// 查询电表信息
|
||||||
@ -54,7 +54,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
UnitDataAnalysis<List<AnalysisBaseDto<decimal>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal>>>
|
UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>>
|
||||||
{
|
{
|
||||||
Code = input.A.Code!,
|
Code = input.A.Code!,
|
||||||
AFN = input.AFN_FC.AFN,
|
AFN = input.AFN_FC.AFN,
|
||||||
@ -69,7 +69,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
DensityUnit = DensityUnit.Minute,
|
DensityUnit = DensityUnit.Minute,
|
||||||
ReceivedTime = input.ReceivedTime
|
ReceivedTime = input.ReceivedTime
|
||||||
};
|
};
|
||||||
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal>(unitDataAnalysis);
|
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal?>(unitDataAnalysis);
|
||||||
result?.Invoke(unitDataAnalysis);
|
result?.Invoke(unitDataAnalysis);
|
||||||
return await Task.FromResult(true);
|
return await Task.FromResult(true);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -39,7 +39,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
int density = Convert.ToInt32(Convert.ToInt32(datas[1]).GetEnumDescription(typeof(DensityEnums)));
|
int density = Convert.ToInt32(Convert.ToInt32(datas[1]).GetEnumDescription(typeof(DensityEnums)));
|
||||||
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
||||||
|
|
||||||
List<AnalysisBaseDto<decimal>> data = datas.GenerateFinalResultTd_c(3, density, dataType, "A相电流曲线");
|
List<AnalysisBaseDto<decimal?>> data = datas.GenerateFinalResultTd_c(3, density, dataType, "A相电流曲线");
|
||||||
if (data.Count > 0)
|
if (data.Count > 0)
|
||||||
{
|
{
|
||||||
// 查询电表信息
|
// 查询电表信息
|
||||||
@ -55,7 +55,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
UnitDataAnalysis<List<AnalysisBaseDto<decimal>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal>>>
|
UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>>
|
||||||
{
|
{
|
||||||
Code = input.A.Code!,
|
Code = input.A.Code!,
|
||||||
AFN = input.AFN_FC.AFN,
|
AFN = input.AFN_FC.AFN,
|
||||||
@ -70,7 +70,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
DensityUnit = DensityUnit.Minute,
|
DensityUnit = DensityUnit.Minute,
|
||||||
ReceivedTime = input.ReceivedTime
|
ReceivedTime = input.ReceivedTime
|
||||||
};
|
};
|
||||||
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal>(unitDataAnalysis);
|
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal?>(unitDataAnalysis);
|
||||||
result?.Invoke(unitDataAnalysis);
|
result?.Invoke(unitDataAnalysis);
|
||||||
return await Task.FromResult(true);
|
return await Task.FromResult(true);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -39,7 +39,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
int density = Convert.ToInt32(Convert.ToInt32(datas[1]).GetEnumDescription(typeof(DensityEnums)));
|
int density = Convert.ToInt32(Convert.ToInt32(datas[1]).GetEnumDescription(typeof(DensityEnums)));
|
||||||
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
||||||
|
|
||||||
List<AnalysisBaseDto<decimal>> data = datas.GenerateFinalResultTd_c(3, density, dataType, "B相电流曲线");
|
List<AnalysisBaseDto<decimal?>> data = datas.GenerateFinalResultTd_c(3, density, dataType, "B相电流曲线");
|
||||||
if (data.Count > 0)
|
if (data.Count > 0)
|
||||||
{
|
{
|
||||||
// 查询电表信息
|
// 查询电表信息
|
||||||
@ -55,7 +55,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
UnitDataAnalysis<List<AnalysisBaseDto<decimal>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal>>>
|
UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>>
|
||||||
{
|
{
|
||||||
Code = input.A.Code!,
|
Code = input.A.Code!,
|
||||||
AFN = input.AFN_FC.AFN,
|
AFN = input.AFN_FC.AFN,
|
||||||
@ -70,7 +70,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
DensityUnit = DensityUnit.Minute,
|
DensityUnit = DensityUnit.Minute,
|
||||||
ReceivedTime = input.ReceivedTime
|
ReceivedTime = input.ReceivedTime
|
||||||
};
|
};
|
||||||
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal>(unitDataAnalysis);
|
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal?>(unitDataAnalysis);
|
||||||
result?.Invoke(unitDataAnalysis);
|
result?.Invoke(unitDataAnalysis);
|
||||||
return await Task.FromResult(true);
|
return await Task.FromResult(true);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -39,7 +39,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
int density = Convert.ToInt32(Convert.ToInt32(datas[1]).GetEnumDescription(typeof(DensityEnums)));
|
int density = Convert.ToInt32(Convert.ToInt32(datas[1]).GetEnumDescription(typeof(DensityEnums)));
|
||||||
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
||||||
|
|
||||||
List<AnalysisBaseDto<decimal>> data = datas.GenerateFinalResultTd_c(3, density, dataType, "C相电流曲线");
|
List<AnalysisBaseDto<decimal?>> data = datas.GenerateFinalResultTd_c(3, density, dataType, "C相电流曲线");
|
||||||
if (data.Count > 0)
|
if (data.Count > 0)
|
||||||
{
|
{
|
||||||
// 查询电表信息
|
// 查询电表信息
|
||||||
@ -55,7 +55,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
UnitDataAnalysis<List<AnalysisBaseDto<decimal>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal>>>
|
UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>>
|
||||||
{
|
{
|
||||||
Code = input.A.Code!,
|
Code = input.A.Code!,
|
||||||
AFN = input.AFN_FC.AFN,
|
AFN = input.AFN_FC.AFN,
|
||||||
@ -70,7 +70,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
DensityUnit = DensityUnit.Minute,
|
DensityUnit = DensityUnit.Minute,
|
||||||
ReceivedTime = input.ReceivedTime
|
ReceivedTime = input.ReceivedTime
|
||||||
};
|
};
|
||||||
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal>(unitDataAnalysis);
|
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal?>(unitDataAnalysis);
|
||||||
result?.Invoke(unitDataAnalysis);
|
result?.Invoke(unitDataAnalysis);
|
||||||
return await Task.FromResult(true);
|
return await Task.FromResult(true);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -39,7 +39,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
int density = Convert.ToInt32(Convert.ToInt32(datas[1]).GetEnumDescription(typeof(DensityEnums)));
|
int density = Convert.ToInt32(Convert.ToInt32(datas[1]).GetEnumDescription(typeof(DensityEnums)));
|
||||||
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
||||||
|
|
||||||
List<AnalysisBaseDto<decimal>> data = datas.GenerateFinalResultTd_c(3, density, dataType, "测量点零序电流曲线");
|
List<AnalysisBaseDto<decimal?>> data = datas.GenerateFinalResultTd_c(3, density, dataType, "测量点零序电流曲线");
|
||||||
if (data.Count > 0)
|
if (data.Count > 0)
|
||||||
{
|
{
|
||||||
// 查询电表信息
|
// 查询电表信息
|
||||||
@ -55,7 +55,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
UnitDataAnalysis<List<AnalysisBaseDto<decimal>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal>>>
|
UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>>
|
||||||
{
|
{
|
||||||
Code = input.A.Code!,
|
Code = input.A.Code!,
|
||||||
AFN = input.AFN_FC.AFN,
|
AFN = input.AFN_FC.AFN,
|
||||||
@ -70,7 +70,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
DensityUnit = DensityUnit.Minute,
|
DensityUnit = DensityUnit.Minute,
|
||||||
ReceivedTime = input.ReceivedTime
|
ReceivedTime = input.ReceivedTime
|
||||||
};
|
};
|
||||||
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal>(unitDataAnalysis);
|
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal?>(unitDataAnalysis);
|
||||||
result?.Invoke(unitDataAnalysis);
|
result?.Invoke(unitDataAnalysis);
|
||||||
return await Task.FromResult(true);
|
return await Task.FromResult(true);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -39,7 +39,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
int density = Convert.ToInt32(Convert.ToInt32(datas[1]).GetEnumDescription(typeof(DensityEnums)));
|
int density = Convert.ToInt32(Convert.ToInt32(datas[1]).GetEnumDescription(typeof(DensityEnums)));
|
||||||
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
||||||
|
|
||||||
List<AnalysisBaseDto<decimal>> data = datas.GenerateFinalResultTd_c(3, density, dataType, "正向有功总电能量曲线");
|
List<AnalysisBaseDto<decimal?>> data = datas.GenerateFinalResultTd_c(3, density, dataType, "正向有功总电能量曲线");
|
||||||
if (data.Count > 0)
|
if (data.Count > 0)
|
||||||
{
|
{
|
||||||
// 查询电表信息
|
// 查询电表信息
|
||||||
@ -55,7 +55,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
UnitDataAnalysis<List<AnalysisBaseDto<decimal>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal>>>
|
UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>>
|
||||||
{
|
{
|
||||||
Code = input.A.Code!,
|
Code = input.A.Code!,
|
||||||
AFN = input.AFN_FC.AFN,
|
AFN = input.AFN_FC.AFN,
|
||||||
@ -70,7 +70,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
DensityUnit = DensityUnit.Minute,
|
DensityUnit = DensityUnit.Minute,
|
||||||
ReceivedTime = input.ReceivedTime
|
ReceivedTime = input.ReceivedTime
|
||||||
};
|
};
|
||||||
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal>(unitDataAnalysis);
|
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal?>(unitDataAnalysis);
|
||||||
result?.Invoke(unitDataAnalysis);
|
result?.Invoke(unitDataAnalysis);
|
||||||
return await Task.FromResult(true);
|
return await Task.FromResult(true);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -39,7 +39,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
int density = Convert.ToInt32(Convert.ToInt32(datas[1]).GetEnumDescription(typeof(DensityEnums)));
|
int density = Convert.ToInt32(Convert.ToInt32(datas[1]).GetEnumDescription(typeof(DensityEnums)));
|
||||||
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
||||||
|
|
||||||
List<AnalysisBaseDto<decimal>> data = datas.GenerateFinalResultTd_c(3, density, dataType, "正向无功总电能量曲线");
|
List<AnalysisBaseDto<decimal?>> data = datas.GenerateFinalResultTd_c(3, density, dataType, "正向无功总电能量曲线");
|
||||||
if (data.Count > 0)
|
if (data.Count > 0)
|
||||||
{
|
{
|
||||||
// 查询电表信息
|
// 查询电表信息
|
||||||
@ -55,7 +55,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
UnitDataAnalysis<List<AnalysisBaseDto<decimal>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal>>>
|
UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>>
|
||||||
{
|
{
|
||||||
Code = input.A.Code!,
|
Code = input.A.Code!,
|
||||||
AFN = input.AFN_FC.AFN,
|
AFN = input.AFN_FC.AFN,
|
||||||
@ -70,7 +70,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
DensityUnit = DensityUnit.Minute,
|
DensityUnit = DensityUnit.Minute,
|
||||||
ReceivedTime = input.ReceivedTime
|
ReceivedTime = input.ReceivedTime
|
||||||
};
|
};
|
||||||
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal>(unitDataAnalysis);
|
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal?>(unitDataAnalysis);
|
||||||
result?.Invoke(unitDataAnalysis);
|
result?.Invoke(unitDataAnalysis);
|
||||||
return await Task.FromResult(true);
|
return await Task.FromResult(true);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -39,7 +39,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
int density = Convert.ToInt32(Convert.ToInt32(datas[1]).GetEnumDescription(typeof(DensityEnums)));
|
int density = Convert.ToInt32(Convert.ToInt32(datas[1]).GetEnumDescription(typeof(DensityEnums)));
|
||||||
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
string dataType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}";
|
||||||
|
|
||||||
List<AnalysisBaseDto<decimal>> data = datas.GenerateFinalResultTd_c(3, density, dataType, "反向有功总电能量曲线");
|
List<AnalysisBaseDto<decimal?>> data = datas.GenerateFinalResultTd_c(3, density, dataType, "反向有功总电能量曲线");
|
||||||
if (data.Count > 0)
|
if (data.Count > 0)
|
||||||
{
|
{
|
||||||
// 查询电表信息
|
// 查询电表信息
|
||||||
@ -55,7 +55,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
UnitDataAnalysis<List<AnalysisBaseDto<decimal>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal>>>
|
UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>> unitDataAnalysis = new UnitDataAnalysis<List<AnalysisBaseDto<decimal?>>>
|
||||||
{
|
{
|
||||||
Code = input.A.Code!,
|
Code = input.A.Code!,
|
||||||
AFN = input.AFN_FC.AFN,
|
AFN = input.AFN_FC.AFN,
|
||||||
@ -70,7 +70,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_0DH
|
|||||||
DensityUnit = DensityUnit.Minute,
|
DensityUnit = DensityUnit.Minute,
|
||||||
ReceivedTime = input.ReceivedTime
|
ReceivedTime = input.ReceivedTime
|
||||||
};
|
};
|
||||||
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal>(unitDataAnalysis);
|
await _dataStorage.SaveMultipleDataToIotDbAsync<decimal?>(unitDataAnalysis);
|
||||||
result?.Invoke(unitDataAnalysis);
|
result?.Invoke(unitDataAnalysis);
|
||||||
return await Task.FromResult(true);
|
return await Task.FromResult(true);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -18,6 +18,9 @@ using static FreeSql.Internal.GlobalFilter;
|
|||||||
|
|
||||||
namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_10H
|
namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_10H
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 透抄 电网频率
|
||||||
|
/// </summary>
|
||||||
public class AFN16_F97_Analysis : IAnalysisStrategy<TB3761>
|
public class AFN16_F97_Analysis : IAnalysisStrategy<TB3761>
|
||||||
{
|
{
|
||||||
private readonly ILogger<AFN16_F97_Analysis> _logger;
|
private readonly ILogger<AFN16_F97_Analysis> _logger;
|
||||||
@ -37,7 +40,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_10H
|
|||||||
ArgumentNullException.ThrowIfNull(input.UnitData?.HexMessageList);
|
ArgumentNullException.ThrowIfNull(input.UnitData?.HexMessageList);
|
||||||
|
|
||||||
List<string> datas = await AnalysisDataUnitAsync(input.UnitData.HexMessageList);
|
List<string> datas = await AnalysisDataUnitAsync(input.UnitData.HexMessageList);
|
||||||
AnalysisBaseDto<decimal> data = GenerateFinalResult(datas);
|
AnalysisBaseDto<decimal?> data = GenerateFinalResult(datas);
|
||||||
// 查询电表信息
|
// 查询电表信息
|
||||||
AmmeterInfo ammeterInfo = await _dataStorage.GetMeterInfoAsync(data.DeviceType.ToString(), "15");
|
AmmeterInfo ammeterInfo = await _dataStorage.GetMeterInfoAsync(data.DeviceType.ToString(), "15");
|
||||||
if (ammeterInfo != null)
|
if (ammeterInfo != null)
|
||||||
@ -47,7 +50,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_10H
|
|||||||
data.DatabaseBusiID = ammeterInfo.DatabaseBusiID;
|
data.DatabaseBusiID = ammeterInfo.DatabaseBusiID;
|
||||||
data.DeviceAddress = ammeterInfo.AmmerterAddress;
|
data.DeviceAddress = ammeterInfo.AmmerterAddress;
|
||||||
}
|
}
|
||||||
UnitDataAnalysis<AnalysisBaseDto<decimal>> unitDataAnalysis = new UnitDataAnalysis<AnalysisBaseDto<decimal>>
|
UnitDataAnalysis<AnalysisBaseDto<decimal?>> unitDataAnalysis = new UnitDataAnalysis<AnalysisBaseDto<decimal?>>
|
||||||
{
|
{
|
||||||
Code = input.A.Code!,
|
Code = input.A.Code!,
|
||||||
AFN = input.AFN_FC.AFN,
|
AFN = input.AFN_FC.AFN,
|
||||||
@ -62,7 +65,7 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_10H
|
|||||||
DensityUnit = DensityUnit.Hour,
|
DensityUnit = DensityUnit.Hour,
|
||||||
ReceivedTime = input.ReceivedTime
|
ReceivedTime = input.ReceivedTime
|
||||||
};
|
};
|
||||||
await _dataStorage.SaveDataToIotDbAsync<decimal>(unitDataAnalysis);
|
await _dataStorage.SaveDataToIotDbAsync<decimal?>(unitDataAnalysis);
|
||||||
result?.Invoke(unitDataAnalysis);
|
result?.Invoke(unitDataAnalysis);
|
||||||
return await Task.FromResult(true);
|
return await Task.FromResult(true);
|
||||||
}
|
}
|
||||||
@ -73,10 +76,10 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_10H
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private AnalysisBaseDto<decimal> GenerateFinalResult(List<string> data)
|
private AnalysisBaseDto<decimal?> GenerateFinalResult(List<string> data)
|
||||||
{
|
{
|
||||||
AnalysisBaseDto<decimal> meter = new AnalysisBaseDto<decimal>();
|
AnalysisBaseDto<decimal?> meter = new AnalysisBaseDto<decimal?>();
|
||||||
decimal.TryParse(data[7], out decimal value);
|
|
||||||
var errorCode = data[7].CheckErrorCode();
|
var errorCode = data[7].CheckErrorCode();
|
||||||
if (errorCode != null)
|
if (errorCode != null)
|
||||||
{
|
{
|
||||||
@ -84,7 +87,11 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_10H
|
|||||||
meter.ErrorCodeMsg = errorCode.Item2;
|
meter.ErrorCodeMsg = errorCode.Item2;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
|
if(decimal.TryParse(data[7], out decimal value))
|
||||||
meter.DataValue = value;
|
meter.DataValue = value;
|
||||||
|
}
|
||||||
|
|
||||||
meter.DataType = "10_97";
|
meter.DataType = "10_97";
|
||||||
meter.ValidData = data[2].Equals("91") || data[2].Equals("B1");
|
meter.ValidData = data[2].Equals("91") || data[2].Equals("B1");
|
||||||
meter.FiledDesc = "电网频率";//"电网频率";
|
meter.FiledDesc = "电网频率";//"电网频率";
|
||||||
|
|||||||
@ -93,10 +93,11 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData
|
|||||||
{
|
{
|
||||||
SystemName = _applicationOptions.SystemType,
|
SystemName = _applicationOptions.SystemType,
|
||||||
DeviceId = $"{data.DeviceId}",
|
DeviceId = $"{data.DeviceId}",
|
||||||
DeviceType = $"{data.DeviceType.ToString()}.{IOTDBDataType.Data}",
|
DeviceType = $"{data.DeviceType.ToString()}",
|
||||||
ProjectId = $"{data.ProjectId}",
|
ProjectId = $"{data.ProjectId}",
|
||||||
|
DataType = IOTDBDataTypeConst.Data,
|
||||||
Timestamps = data.TimeSpan!.Value.GetFormatTime(analysisBaseDto.DensityUnit, analysisBaseDto.TimeDensity).GetDateTimeOffset().ToUnixTimeNanoseconds(),
|
Timestamps = data.TimeSpan!.Value.GetFormatTime(analysisBaseDto.DensityUnit, analysisBaseDto.TimeDensity).GetDateTimeOffset().ToUnixTimeNanoseconds(),
|
||||||
SingleMeasuring = new Tuple<string, T>(data.FiledName ?? string.Empty, data.DataValue ?? default)
|
SingleMeasuring = (data.FiledName ?? string.Empty, data.DataValue ?? default)
|
||||||
};
|
};
|
||||||
_runtimeContext.UseTableSessionPool = true; // 使用表模型池
|
_runtimeContext.UseTableSessionPool = true; // 使用表模型池
|
||||||
var taskSendInfo = await _dbProvider.QueryAsync<MeterReadingTelemetryPacketInfo>(new IoTDBQueryOptions() { TableNameOrTreePath = DevicePathBuilder.GetTableName<MeterReadingTelemetryPacketInfo>(), Conditions = conditions, PageIndex = 0, PageSize = 1 });
|
var taskSendInfo = await _dbProvider.QueryAsync<MeterReadingTelemetryPacketInfo>(new IoTDBQueryOptions() { TableNameOrTreePath = DevicePathBuilder.GetTableName<MeterReadingTelemetryPacketInfo>(), Conditions = conditions, PageIndex = 0, PageSize = 1 });
|
||||||
@ -196,10 +197,11 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData
|
|||||||
{
|
{
|
||||||
SystemName = _applicationOptions.SystemType,
|
SystemName = _applicationOptions.SystemType,
|
||||||
DeviceId = $"{item.DeviceId}",
|
DeviceId = $"{item.DeviceId}",
|
||||||
DeviceType = $"{item.DeviceType}.{IOTDBDataType.Data}",
|
DeviceType = $"{item.DeviceType}",
|
||||||
ProjectId = $"{item.ProjectId}",
|
ProjectId = $"{item.ProjectId}",
|
||||||
|
DataType = IOTDBDataTypeConst.Data,
|
||||||
Timestamps = item.TimeSpan!.Value.GetFormatTime(analysisBaseDto.DensityUnit, analysisBaseDto.TimeDensity).GetDateTimeOffset().ToUnixTimeNanoseconds(), // TODO:这里暂时格式化15分钟数据,需要进行调整
|
Timestamps = item.TimeSpan!.Value.GetFormatTime(analysisBaseDto.DensityUnit, analysisBaseDto.TimeDensity).GetDateTimeOffset().ToUnixTimeNanoseconds(), // TODO:这里暂时格式化15分钟数据,需要进行调整
|
||||||
SingleMeasuring = new Tuple<string, T>(item.FiledName ?? string.Empty, item.DataValue ?? default)
|
SingleMeasuring =(item.FiledName ?? string.Empty, item.DataValue ?? default)
|
||||||
};
|
};
|
||||||
_runtimeContext.UseTableSessionPool = true; // 使用表模型池
|
_runtimeContext.UseTableSessionPool = true; // 使用表模型池
|
||||||
var taskSendInfo = await _dbProvider.QueryAsync<MeterReadingTelemetryPacketInfo>(new IoTDBQueryOptions() { TableNameOrTreePath = DevicePathBuilder.GetTableName<MeterReadingTelemetryPacketInfo>(), Conditions = conditions, PageIndex = 0, PageSize = 1 });
|
var taskSendInfo = await _dbProvider.QueryAsync<MeterReadingTelemetryPacketInfo>(new IoTDBQueryOptions() { TableNameOrTreePath = DevicePathBuilder.GetTableName<MeterReadingTelemetryPacketInfo>(), Conditions = conditions, PageIndex = 0, PageSize = 1 });
|
||||||
@ -280,10 +282,11 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData
|
|||||||
{
|
{
|
||||||
SystemName = _applicationOptions.SystemType,
|
SystemName = _applicationOptions.SystemType,
|
||||||
DeviceId = $"{data.DeviceId}",
|
DeviceId = $"{data.DeviceId}",
|
||||||
DeviceType = $"{data.DeviceType}.{IOTDBDataType.Status}",
|
DeviceType = $"{data.DeviceType}",
|
||||||
ProjectId = $"{data.ProjectId}",
|
ProjectId = $"{data.ProjectId}",
|
||||||
|
DataType = IOTDBDataTypeConst.Status,
|
||||||
Timestamps = timestamps,
|
Timestamps = timestamps,
|
||||||
SingleMeasuring = new Tuple<string, T>(data.FiledName!, data.DataValue!)
|
SingleMeasuring = (data.FiledName!, data.DataValue!)
|
||||||
};
|
};
|
||||||
_runtimeContext.UseTableSessionPool = false; // 使树模型池
|
_runtimeContext.UseTableSessionPool = false; // 使树模型池
|
||||||
await _dbProvider.InsertAsync(treeData);
|
await _dbProvider.InsertAsync(treeData);
|
||||||
@ -292,10 +295,11 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData
|
|||||||
{
|
{
|
||||||
SystemName = _applicationOptions.SystemType,
|
SystemName = _applicationOptions.SystemType,
|
||||||
DeviceId = $"{data.DeviceId}",
|
DeviceId = $"{data.DeviceId}",
|
||||||
DeviceType = $"{data.DeviceType}.{IOTDBDataType.Status}",
|
DeviceType = $"{data.DeviceType}",
|
||||||
ProjectId = $"{data.ProjectId}",
|
ProjectId = $"{data.ProjectId}",
|
||||||
|
DataType = IOTDBDataTypeConst.Status,
|
||||||
Timestamps = timestamps,
|
Timestamps = timestamps,
|
||||||
SingleMeasuring = new Tuple<string, string>(ConcentratorStatusFieldConst.FrameData, analysisBaseDto.HexMessage ?? string.Empty)
|
SingleMeasuring = (ConcentratorStatusFieldConst.FrameData, analysisBaseDto.HexMessage ?? string.Empty)
|
||||||
};
|
};
|
||||||
|
|
||||||
_runtimeContext.UseTableSessionPool = false; // 使树模型池
|
_runtimeContext.UseTableSessionPool = false; // 使树模型池
|
||||||
@ -306,10 +310,11 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData
|
|||||||
{
|
{
|
||||||
SystemName = _applicationOptions.SystemType,
|
SystemName = _applicationOptions.SystemType,
|
||||||
DeviceId = $"{data.DeviceId}",
|
DeviceId = $"{data.DeviceId}",
|
||||||
DeviceType = $"{data.DeviceType}.{IOTDBDataType.Status}",
|
DeviceType = $"{data.DeviceType}",
|
||||||
ProjectId = $"{data.ProjectId}",
|
ProjectId = $"{data.ProjectId}",
|
||||||
Timestamps = timestamps,
|
Timestamps = timestamps,
|
||||||
SingleMeasuring = new Tuple<string, long>(ConcentratorStatusFieldConst.RecordingTime, (data.TimeSpan.HasValue ? data.TimeSpan.Value : DateTime.Now).GetDateTimeOffset().ToUnixTimeNanoseconds())
|
DataType = IOTDBDataTypeConst.Status,
|
||||||
|
SingleMeasuring = (ConcentratorStatusFieldConst.RecordingTime, (data.TimeSpan.HasValue ? data.TimeSpan.Value : DateTime.Now).GetDateTimeOffset().ToUnixTimeNanoseconds())
|
||||||
};
|
};
|
||||||
_runtimeContext.UseTableSessionPool = false; // 使树模型池
|
_runtimeContext.UseTableSessionPool = false; // 使树模型池
|
||||||
await _dbProvider.InsertAsync(treeRecordingTimeData);
|
await _dbProvider.InsertAsync(treeRecordingTimeData);
|
||||||
@ -318,10 +323,11 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData
|
|||||||
{
|
{
|
||||||
SystemName = _applicationOptions.SystemType,
|
SystemName = _applicationOptions.SystemType,
|
||||||
DeviceId = $"{data.DeviceId}",
|
DeviceId = $"{data.DeviceId}",
|
||||||
DeviceType = $"{data.DeviceType}.{IOTDBDataType.Status}",
|
DeviceType = $"{data.DeviceType}",
|
||||||
ProjectId = $"{data.ProjectId}",
|
ProjectId = $"{data.ProjectId}",
|
||||||
|
DataType = IOTDBDataTypeConst.Status,
|
||||||
Timestamps = timestamps,
|
Timestamps = timestamps,
|
||||||
SingleMeasuring = new Tuple<string, string>(ConcentratorStatusFieldConst.Remark, data.FiledDesc ?? string.Empty)
|
SingleMeasuring = (ConcentratorStatusFieldConst.Remark, data.FiledDesc ?? string.Empty)
|
||||||
};
|
};
|
||||||
_runtimeContext.UseTableSessionPool = false; // 使树模型池
|
_runtimeContext.UseTableSessionPool = false; // 使树模型池
|
||||||
await _dbProvider.InsertAsync(treeRemarkData);
|
await _dbProvider.InsertAsync(treeRemarkData);
|
||||||
@ -353,10 +359,11 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData
|
|||||||
{
|
{
|
||||||
SystemName = _applicationOptions.SystemType,
|
SystemName = _applicationOptions.SystemType,
|
||||||
DeviceId = $"{item.DeviceId}",
|
DeviceId = $"{item.DeviceId}",
|
||||||
DeviceType = $"{item.DeviceType}.{IOTDBDataType.Status}",
|
DeviceType = $"{item.DeviceType}",
|
||||||
ProjectId = $"{item.ProjectId}",
|
ProjectId = $"{item.ProjectId}",
|
||||||
|
DataType = IOTDBDataTypeConst.Status,
|
||||||
Timestamps = timestamps,
|
Timestamps = timestamps,
|
||||||
SingleMeasuring = new Tuple<string, T>(item.FiledName!, item.DataValue!)
|
SingleMeasuring = (item.FiledName!, item.DataValue!)
|
||||||
};
|
};
|
||||||
_runtimeContext.UseTableSessionPool = false; // 使树模型池
|
_runtimeContext.UseTableSessionPool = false; // 使树模型池
|
||||||
await _dbProvider.InsertAsync(treeData);
|
await _dbProvider.InsertAsync(treeData);
|
||||||
@ -364,11 +371,11 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData
|
|||||||
var treeFrameData = new TreeModelSingleMeasuringEntity<string>()
|
var treeFrameData = new TreeModelSingleMeasuringEntity<string>()
|
||||||
{
|
{
|
||||||
SystemName = _applicationOptions.SystemType,
|
SystemName = _applicationOptions.SystemType,
|
||||||
DeviceId = $"{item.DeviceId}",
|
DeviceType = $"{item.DeviceType}",
|
||||||
DeviceType = $"{item.DeviceType}.{IOTDBDataType.Status}",
|
|
||||||
ProjectId = $"{item.ProjectId}",
|
ProjectId = $"{item.ProjectId}",
|
||||||
|
DataType = IOTDBDataTypeConst.Status,
|
||||||
Timestamps = timestamps,
|
Timestamps = timestamps,
|
||||||
SingleMeasuring = new Tuple<string, string>(ConcentratorStatusFieldConst.FrameData, analysisBaseDto.HexMessage ?? string.Empty)
|
SingleMeasuring = (ConcentratorStatusFieldConst.FrameData, analysisBaseDto.HexMessage ?? string.Empty)
|
||||||
};
|
};
|
||||||
|
|
||||||
_runtimeContext.UseTableSessionPool = false; // 使树模型池
|
_runtimeContext.UseTableSessionPool = false; // 使树模型池
|
||||||
@ -378,11 +385,11 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData
|
|||||||
var treeRecordingTimeData = new TreeModelSingleMeasuringEntity<long>()
|
var treeRecordingTimeData = new TreeModelSingleMeasuringEntity<long>()
|
||||||
{
|
{
|
||||||
SystemName = _applicationOptions.SystemType,
|
SystemName = _applicationOptions.SystemType,
|
||||||
DeviceId = $"{item.DeviceId}",
|
DeviceType = $"{item.DeviceType}",
|
||||||
DeviceType = $"{item.DeviceType}.{IOTDBDataType.Status}",
|
|
||||||
ProjectId = $"{item.ProjectId}",
|
ProjectId = $"{item.ProjectId}",
|
||||||
|
DataType = IOTDBDataTypeConst.Status,
|
||||||
Timestamps = timestamps,
|
Timestamps = timestamps,
|
||||||
SingleMeasuring = new Tuple<string, long>(ConcentratorStatusFieldConst.RecordingTime, (item.TimeSpan.HasValue ? item.TimeSpan.Value : DateTime.Now).GetDateTimeOffset().ToUnixTimeNanoseconds())
|
SingleMeasuring = (ConcentratorStatusFieldConst.RecordingTime, (item.TimeSpan.HasValue ? item.TimeSpan.Value : DateTime.Now).GetDateTimeOffset().ToUnixTimeNanoseconds())
|
||||||
};
|
};
|
||||||
_runtimeContext.UseTableSessionPool = false; // 使树模型池
|
_runtimeContext.UseTableSessionPool = false; // 使树模型池
|
||||||
await _dbProvider.InsertAsync(treeRecordingTimeData);
|
await _dbProvider.InsertAsync(treeRecordingTimeData);
|
||||||
@ -390,11 +397,11 @@ namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData
|
|||||||
var treeRemarkData = new TreeModelSingleMeasuringEntity<string>()
|
var treeRemarkData = new TreeModelSingleMeasuringEntity<string>()
|
||||||
{
|
{
|
||||||
SystemName = _applicationOptions.SystemType,
|
SystemName = _applicationOptions.SystemType,
|
||||||
DeviceId = $"{item.DeviceId}",
|
DeviceType = $"{item.DeviceType}",
|
||||||
DeviceType = $"{item.DeviceType}.{IOTDBDataType.Status}",
|
|
||||||
ProjectId = $"{item.ProjectId}",
|
ProjectId = $"{item.ProjectId}",
|
||||||
|
DataType = IOTDBDataTypeConst.Status,
|
||||||
Timestamps = timestamps,
|
Timestamps = timestamps,
|
||||||
SingleMeasuring = new Tuple<string, string>(ConcentratorStatusFieldConst.Remark, item.FiledDesc ?? string.Empty)
|
SingleMeasuring =(ConcentratorStatusFieldConst.Remark, item.FiledDesc ?? string.Empty)
|
||||||
};
|
};
|
||||||
_runtimeContext.UseTableSessionPool = false; // 使树模型池
|
_runtimeContext.UseTableSessionPool = false; // 使树模型池
|
||||||
await _dbProvider.InsertAsync(treeRemarkData);
|
await _dbProvider.InsertAsync(treeRemarkData);
|
||||||
|
|||||||
@ -21,10 +21,13 @@ namespace JiShe.CollectBus.Protocol.T37612012.Appendix
|
|||||||
var day = data[3];
|
var day = data[3];
|
||||||
string binString = data[4].HexTo4BinZero();
|
string binString = data[4].HexTo4BinZero();
|
||||||
var months = (binString.Substring(3, 1).BinToDec() * 10) + Convert.ToInt32(binString.Substring(4, 4).BinToHex());
|
var months = (binString.Substring(3, 1).BinToDec() * 10) + Convert.ToInt32(binString.Substring(4, 4).BinToHex());
|
||||||
var week = binString.Substring(0, 3).HexTo4BinZero();
|
var week = binString.Substring(0, 3).BinToHex();
|
||||||
var year = $"{DateTime.Now.ToString("yyyy").Substring(0, 2)}{data[5]}";
|
var year = $"{DateTime.Now.ToString("yyyy").Substring(0, 2)}{data[5]}";
|
||||||
string date= $"{year}-{months.ToString().PadLeft(2, '0')}-{day} {hours}:{minutes}:{seconds}_{week}";
|
string date= $"{year}-{months.ToString().PadLeft(2, '0')}-{day} {hours}:{minutes}:{seconds}";
|
||||||
result?.Invoke(date);
|
string[] weekdays = {"", "星期一", "星期二", "星期三","星期四", "星期五", "星期六", "星期日"};
|
||||||
|
int.TryParse(week, out int weekday);
|
||||||
|
// Item1=日期,Item2=星期几
|
||||||
|
result?.Invoke(Tuple.Create(date, weekdays[weekday]));
|
||||||
return await Task.FromResult(true);
|
return await Task.FromResult(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -4,6 +4,7 @@ using JiShe.CollectBus.Common.Helpers;
|
|||||||
using JiShe.CollectBus.Protocol.Contracts.Protocol.Dto;
|
using JiShe.CollectBus.Protocol.Contracts.Protocol.Dto;
|
||||||
using NUglify.JavaScript.Syntax;
|
using NUglify.JavaScript.Syntax;
|
||||||
using System.Text.RegularExpressions;
|
using System.Text.RegularExpressions;
|
||||||
|
using YamlDotNet.Core.Tokens;
|
||||||
|
|
||||||
namespace JiShe.CollectBus.Protocol.T37612012
|
namespace JiShe.CollectBus.Protocol.T37612012
|
||||||
{
|
{
|
||||||
@ -239,15 +240,15 @@ namespace JiShe.CollectBus.Protocol.T37612012
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="entity"></param>
|
/// <param name="entity"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public static List<AnalysisBaseDto<decimal>> GenerateFinalResultTd_c(this List<string> data, int index,int density,string dataType, string filedDesc = "")
|
public static List<AnalysisBaseDto<decimal?>> GenerateFinalResultTd_c(this List<string> data, int index,int density,string dataType, string filedDesc = "")
|
||||||
{
|
{
|
||||||
List<AnalysisBaseDto<decimal>> list = new List<AnalysisBaseDto<decimal>>();
|
List<AnalysisBaseDto<decimal?>> list = new List<AnalysisBaseDto<decimal?>>();
|
||||||
for (int i = index; i < data.Count; i++)
|
for (int i = index; i < data.Count; i++)
|
||||||
{
|
{
|
||||||
AnalysisBaseDto<decimal> meter = new AnalysisBaseDto<decimal>();
|
AnalysisBaseDto<decimal?> meter = new AnalysisBaseDto<decimal?>
|
||||||
meter.DeviceType= MeterTypeEnum.Ammeter;
|
{
|
||||||
|
DeviceType = MeterTypeEnum.Ammeter
|
||||||
decimal value = 0;
|
};
|
||||||
var errorCode = data[i].CheckErrorCode();
|
var errorCode = data[i].CheckErrorCode();
|
||||||
if (errorCode != null)
|
if (errorCode != null)
|
||||||
{
|
{
|
||||||
@ -255,9 +256,13 @@ namespace JiShe.CollectBus.Protocol.T37612012
|
|||||||
meter.ErrorCodeMsg = errorCode.Item2;
|
meter.ErrorCodeMsg = errorCode.Item2;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
decimal.TryParse(data[i], out value);
|
{
|
||||||
|
if(decimal.TryParse(data[i], out decimal value))
|
||||||
|
{
|
||||||
meter.DataValue = value;
|
meter.DataValue = value;
|
||||||
meter.DataType = dataType.ToUpper();
|
}
|
||||||
|
}
|
||||||
|
meter.DataType = dataType;
|
||||||
meter.FiledDesc = filedDesc;
|
meter.FiledDesc = filedDesc;
|
||||||
meter.FiledName = meter.DataType.GetDataFieldByGatherDataType() ?? string.Empty;
|
meter.FiledName = meter.DataType.GetDataFieldByGatherDataType() ?? string.Empty;
|
||||||
if (DateTime.TryParse(CalculateTimeSpan(i - 3, data[0], density), out DateTime readingDate))
|
if (DateTime.TryParse(CalculateTimeSpan(i - 3, data[0], density), out DateTime readingDate))
|
||||||
@ -276,14 +281,13 @@ namespace JiShe.CollectBus.Protocol.T37612012
|
|||||||
/// <param name="timeSpan"></param>
|
/// <param name="timeSpan"></param>
|
||||||
/// <param name="filedDesc"></param>
|
/// <param name="filedDesc"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public static List<AnalysisBaseDto<decimal>> GenerateFinalResultTd_m(this List<string> data, int index,string dataType,string timeSpan, string filedDesc = "")
|
public static List<AnalysisBaseDto<decimal?>> GenerateFinalResultTd_m(this List<string> data, int index,string dataType,string timeSpan, string filedDesc = "")
|
||||||
{
|
{
|
||||||
List<AnalysisBaseDto<decimal>> list = new List<AnalysisBaseDto<decimal>>();
|
List<AnalysisBaseDto<decimal?>> list = new List<AnalysisBaseDto<decimal?>>();
|
||||||
for (int i = index; i < data.Count; i++)
|
for (int i = index; i < data.Count; i++)
|
||||||
{
|
{
|
||||||
AnalysisBaseDto<decimal> meter = new AnalysisBaseDto<decimal>();
|
AnalysisBaseDto<decimal?> meter = new AnalysisBaseDto<decimal?>();
|
||||||
meter.DeviceType = MeterTypeEnum.Ammeter;
|
meter.DeviceType = MeterTypeEnum.Ammeter;
|
||||||
decimal value = 0;
|
|
||||||
var errorCode = data[i].CheckErrorCode();
|
var errorCode = data[i].CheckErrorCode();
|
||||||
if (errorCode != null)
|
if (errorCode != null)
|
||||||
{
|
{
|
||||||
@ -291,8 +295,12 @@ namespace JiShe.CollectBus.Protocol.T37612012
|
|||||||
meter.ErrorCodeMsg = errorCode.Item2;
|
meter.ErrorCodeMsg = errorCode.Item2;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
decimal.TryParse(data[i], out value);
|
{
|
||||||
|
if(decimal.TryParse(data[i], out decimal value))
|
||||||
|
{
|
||||||
meter.DataValue = value;
|
meter.DataValue = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
if (DateTime.TryParse(timeSpan, out DateTime readingDate))
|
if (DateTime.TryParse(timeSpan, out DateTime readingDate))
|
||||||
{
|
{
|
||||||
meter.TimeSpan = readingDate;
|
meter.TimeSpan = readingDate;
|
||||||
@ -312,13 +320,13 @@ namespace JiShe.CollectBus.Protocol.T37612012
|
|||||||
/// <param name="data"></param>
|
/// <param name="data"></param>
|
||||||
/// <param name="remark"></param>
|
/// <param name="remark"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public static List<AnalysisBaseDto<decimal>> GenerateFinalResultTd_d(this List<string> data, int index,string dataType, string timeSpan, string filedDesc = "")
|
public static List<AnalysisBaseDto<decimal?>> GenerateFinalResultTd_d(this List<string> data, int index,string dataType, string timeSpan, string filedDesc = "")
|
||||||
{
|
{
|
||||||
List<AnalysisBaseDto<decimal>> list = new List<AnalysisBaseDto<decimal>>();
|
List<AnalysisBaseDto<decimal?>> list = new List<AnalysisBaseDto<decimal?>>();
|
||||||
int typeIndex = 0;
|
int typeIndex = 0;
|
||||||
for (int i = index; i < data.Count; i++)
|
for (int i = index; i < data.Count; i++)
|
||||||
{
|
{
|
||||||
AnalysisBaseDto<decimal> meter = new AnalysisBaseDto<decimal>
|
AnalysisBaseDto<decimal?> meter = new AnalysisBaseDto<decimal?>
|
||||||
{
|
{
|
||||||
DeviceType = MeterTypeEnum.Ammeter
|
DeviceType = MeterTypeEnum.Ammeter
|
||||||
};
|
};
|
||||||
@ -330,8 +338,12 @@ namespace JiShe.CollectBus.Protocol.T37612012
|
|||||||
meter.ErrorCodeMsg = errorCode.Item2;
|
meter.ErrorCodeMsg = errorCode.Item2;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
decimal.TryParse(data[i], out value);
|
{
|
||||||
|
if(decimal.TryParse(data[i], out value))
|
||||||
|
{
|
||||||
meter.DataValue = value;
|
meter.DataValue = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
if (DateTime.TryParse(timeSpan, out DateTime readingDate))
|
if (DateTime.TryParse(timeSpan, out DateTime readingDate))
|
||||||
{
|
{
|
||||||
meter.TimeSpan = readingDate;
|
meter.TimeSpan = readingDate;
|
||||||
@ -364,29 +376,33 @@ namespace JiShe.CollectBus.Protocol.T37612012
|
|||||||
/// <param name="meterDatas"></param>
|
/// <param name="meterDatas"></param>
|
||||||
/// <param name="mark"></param>
|
/// <param name="mark"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public static List<AnalysisBaseDto<decimal>> IsValidData(this List<AnalysisBaseDto<decimal>> meterDatas, List<string> mark)
|
public static List<AnalysisBaseDto<decimal?>> IsValidData(this List<AnalysisBaseDto<decimal?>> meterDatas, List<string> mark)
|
||||||
{
|
{
|
||||||
bool isUpload = false;
|
bool isUpload = false;
|
||||||
var jfpgSum = 0M;
|
var jfpgSum = 0M;
|
||||||
var totalItem = meterDatas.Find(f => f.DataType.Equals(mark[0]));//meterDatas.Find(f => f.DataType.Equals(mark[0]));
|
foreach (var item in meterDatas)
|
||||||
for (int i = 1; i <= meterDatas.Count - 1; i++)
|
|
||||||
{
|
{
|
||||||
var value = meterDatas[i];//meterDatas.Find(f => f.DataType.Equals(mark[i]));
|
if (item.ValidData && item.DataValue.HasValue)
|
||||||
if (value.ValidData)
|
jfpgSum += item.DataValue.Value;
|
||||||
jfpgSum += value.DataValue;
|
|
||||||
}
|
}
|
||||||
|
var totalItem = meterDatas.FirstOrDefault(f => f.DataType.Equals(mark[0]));//meterDatas.Find(f => f.DataType.Equals(mark[0]));
|
||||||
|
if (totalItem != null)
|
||||||
|
{
|
||||||
var floatingNum = (jfpgSum * 5 / 100);//上下浮动数据
|
var floatingNum = (jfpgSum * 5 / 100);//上下浮动数据
|
||||||
var minjfpgSum = jfpgSum - floatingNum;//100-(100*5/100);
|
var minjfpgSum = jfpgSum - floatingNum;//100-(100*5/100);
|
||||||
var maxjfpgSum = jfpgSum + floatingNum;
|
var maxjfpgSum = jfpgSum + floatingNum;
|
||||||
if (totalItem.DataValue <= maxjfpgSum || totalItem.DataValue >= minjfpgSum)//总值,在JFPG之和的浮动范围内
|
if ((totalItem.DataValue <= maxjfpgSum || totalItem.DataValue >= minjfpgSum))//总值,在JFPG之和的浮动范围内
|
||||||
isUpload = true;
|
isUpload = true;
|
||||||
else
|
else
|
||||||
isUpload = false;
|
isUpload = false;
|
||||||
|
}
|
||||||
if (!isUpload)
|
if (!isUpload)
|
||||||
|
{
|
||||||
meterDatas.ForEach(f =>
|
meterDatas.ForEach(f =>
|
||||||
{
|
{
|
||||||
f.ValidData = false;
|
f.ValidData = false;
|
||||||
});
|
});
|
||||||
|
}
|
||||||
return meterDatas;
|
return meterDatas;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -730,7 +730,6 @@ namespace JiShe.CollectBus.Protocol.T37612012
|
|||||||
List<string> values = new List<string>() { $"{dataTime:yy}", $"{dataTime:MM}", $"{dataTime:dd}", $"{dataTime:HH}", $"{dataTime:mm}", };
|
List<string> values = new List<string>() { $"{dataTime:yy}", $"{dataTime:MM}", $"{dataTime:dd}", $"{dataTime:HH}", $"{dataTime:mm}", };
|
||||||
values.Reverse();
|
values.Reverse();
|
||||||
return values;
|
return values;
|
||||||
//return string.Join("", values);
|
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
|||||||
@ -21,14 +21,13 @@ namespace JiShe.CollectBus.DataChannels
|
|||||||
/// 定时任务数据通道写入
|
/// 定时任务数据通道写入
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
Task ScheduledMeterTaskWriterAsync(ChannelWriter<Tuple<string, List<MeterReadingTelemetryPacketInfo>>> _telemetryPacketInfoWriter, Tuple<string, List<MeterReadingTelemetryPacketInfo>> dataItems);
|
Task ScheduledMeterTaskWriterAsync(ChannelWriter<ValueTuple<string, List<MeterReadingTelemetryPacketInfo>>> _telemetryPacketInfoWriter, ValueTuple<string, List<MeterReadingTelemetryPacketInfo>> dataItems);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 定时任务数据入库和Kafka推送通道
|
/// 定时任务数据入库和Kafka推送通道
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
Task ScheduledMeterTaskReadingAsync(ChannelReader<Tuple<string, List<MeterReadingTelemetryPacketInfo>>> _telemetryPacketInfoReader,
|
Task ScheduledMeterTaskReadingAsync(ChannelReader<ValueTuple<string, List<MeterReadingTelemetryPacketInfo>>> _telemetryPacketInfoReader );
|
||||||
CancellationToken cancellationToken);
|
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -81,7 +81,7 @@ public class CollectBusApplicationModule : AbpModule
|
|||||||
//}).ConfigureAwait(false);
|
//}).ConfigureAwait(false);
|
||||||
|
|
||||||
//下发任务通道构建
|
//下发任务通道构建
|
||||||
DataChannelManage.TaskDataChannel = Channel.CreateUnbounded<Tuple<string, List<MeterReadingTelemetryPacketInfo>>>();
|
DataChannelManage.TaskDataChannel = Channel.CreateUnbounded<ValueTuple<string, List<MeterReadingTelemetryPacketInfo>>>();
|
||||||
|
|
||||||
//默认初始化表计信息
|
//默认初始化表计信息
|
||||||
var dbContext = context.ServiceProvider.GetRequiredService<EnergySystemScheduledMeterReadingService>();
|
var dbContext = context.ServiceProvider.GetRequiredService<EnergySystemScheduledMeterReadingService>();
|
||||||
|
|||||||
@ -13,6 +13,6 @@ namespace JiShe.CollectBus.DataChannels
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 下发任务通道
|
/// 下发任务通道
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static Channel<Tuple<string, List<MeterReadingTelemetryPacketInfo>>> TaskDataChannel;
|
public static Channel<ValueTuple<string, List<MeterReadingTelemetryPacketInfo>>> TaskDataChannel;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -50,7 +50,7 @@ namespace JiShe.CollectBus.DataChannels
|
|||||||
/// 定时任务数据通道写入
|
/// 定时任务数据通道写入
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public async Task ScheduledMeterTaskWriterAsync(ChannelWriter<Tuple<string, List<MeterReadingTelemetryPacketInfo>>> _telemetryPacketInfoWriter, Tuple<string, List<MeterReadingTelemetryPacketInfo>> dataItems)
|
public async Task ScheduledMeterTaskWriterAsync(ChannelWriter<ValueTuple<string, List<MeterReadingTelemetryPacketInfo>>> _telemetryPacketInfoWriter, ValueTuple<string, List<MeterReadingTelemetryPacketInfo>> dataItems)
|
||||||
{
|
{
|
||||||
await _telemetryPacketInfoWriter.WriteAsync(dataItems);
|
await _telemetryPacketInfoWriter.WriteAsync(dataItems);
|
||||||
}
|
}
|
||||||
@ -61,47 +61,62 @@ namespace JiShe.CollectBus.DataChannels
|
|||||||
/// 定时任务数据入库和Kafka推送通道
|
/// 定时任务数据入库和Kafka推送通道
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public async Task ScheduledMeterTaskReadingAsync(
|
public async Task ScheduledMeterTaskReadingAsync(
|
||||||
ChannelReader<Tuple<string, List<MeterReadingTelemetryPacketInfo>>> telemetryPacketInfoReader,
|
ChannelReader<ValueTuple<string, List<MeterReadingTelemetryPacketInfo>>> telemetryPacketInfoReader)
|
||||||
CancellationToken cancellationToken = default)
|
|
||||||
{
|
{
|
||||||
const int BatchSize = 20000; // 修正批次大小
|
const int BatchSize = 20000;
|
||||||
const int EmptyWaitMilliseconds = 1000;
|
const int EmptyWaitMilliseconds = 1000;
|
||||||
var timeout = TimeSpan.FromSeconds(5);
|
var timeout = TimeSpan.FromSeconds(5);
|
||||||
|
var timer = Stopwatch.StartNew();
|
||||||
|
long timeoutMilliseconds = 0;
|
||||||
var metadata = await _dbProvider.GetMetadata<MeterReadingTelemetryPacketInfo>();
|
var metadata = await _dbProvider.GetMetadata<MeterReadingTelemetryPacketInfo>();
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
while (!cancellationToken.IsCancellationRequested)
|
while (true)
|
||||||
{
|
{
|
||||||
var batchStopwatch = Stopwatch.StartNew();
|
var batch = new List<ValueTuple<string, List<MeterReadingTelemetryPacketInfo>>>();
|
||||||
var batch = new List<Tuple<string, List<MeterReadingTelemetryPacketInfo>>>();
|
var canRead = telemetryPacketInfoReader.Count;
|
||||||
|
if (canRead <= 0)
|
||||||
|
{
|
||||||
|
if (timeoutMilliseconds > 0)
|
||||||
|
{
|
||||||
|
_logger.LogError($"{nameof(ScheduledMeterTaskReadingAsync)} 通道处理数据耗时{timeoutMilliseconds}毫秒");
|
||||||
|
}
|
||||||
|
timeoutMilliseconds = 0;
|
||||||
|
//无消息时短等待1秒
|
||||||
|
await Task.Delay(EmptyWaitMilliseconds);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
timer.Restart();
|
||||||
|
var startTime = DateTime.Now;
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
// 异步批量读取数据
|
// 异步批量读取数据
|
||||||
while (batch.Count < BatchSize && batchStopwatch.Elapsed < timeout)
|
while (batch != null && batch.Count < BatchSize && (DateTime.Now - startTime) < timeout)
|
||||||
{
|
{
|
||||||
while (telemetryPacketInfoReader.TryRead(out var data))
|
try
|
||||||
{
|
{
|
||||||
batch.Add(data);
|
if (telemetryPacketInfoReader.TryRead(out var dataItem))
|
||||||
if (batch.Count >= BatchSize) break;
|
{
|
||||||
}
|
batch.Add(dataItem);
|
||||||
|
|
||||||
if (batch.Count >= BatchSize) break;
|
|
||||||
|
|
||||||
// 无更多数据时等待
|
|
||||||
if (!await telemetryPacketInfoReader.WaitToReadAsync(cancellationToken))
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (OperationCanceledException)
|
catch (Exception)
|
||||||
{
|
{
|
||||||
break;
|
throw;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception)
|
||||||
|
{
|
||||||
|
throw;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (batch.Count == 0)
|
if (batch.Count == 0)
|
||||||
{
|
{
|
||||||
await Task.Delay(EmptyWaitMilliseconds, cancellationToken);
|
await Task.Delay(EmptyWaitMilliseconds);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -125,22 +140,26 @@ namespace JiShe.CollectBus.DataChannels
|
|||||||
// 批量写入数据库
|
// 批量写入数据库
|
||||||
await _dbProvider.BatchInsertAsync(metadata, records);
|
await _dbProvider.BatchInsertAsync(metadata, records);
|
||||||
|
|
||||||
// 限流推送Kafka
|
//// 限流推送Kafka
|
||||||
await DeviceGroupBalanceControl.ProcessWithThrottleAsync(
|
//await DeviceGroupBalanceControl.ProcessWithThrottleAsync(
|
||||||
items: records,
|
// items: records,
|
||||||
deviceIdSelector: data => data.DeviceId,
|
// deviceIdSelector: data => data.DeviceId,
|
||||||
processor: async (data, groupIndex) =>
|
// processor: async (data, groupIndex) =>
|
||||||
await KafkaProducerIssuedMessageAction(topicName, data, groupIndex)
|
// await KafkaProducerIssuedMessageAction(topicName, data, groupIndex)
|
||||||
);
|
//);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
_logger.LogError(ex, "处理主题 {TopicName} 数据时发生异常", topicName);
|
_logger.LogError(ex, "数据通道处理主题 {TopicName} 数据时发生异常", topicName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_logger.LogInformation("处理完成批次: {Count} 条, 耗时: {Elapsed}ms",
|
batch.Clear();
|
||||||
batch.Count, batchStopwatch.ElapsedMilliseconds);
|
timer.Stop();
|
||||||
|
|
||||||
|
timeoutMilliseconds = timeoutMilliseconds + timer.ElapsedMilliseconds;
|
||||||
|
|
||||||
|
startTime = DateTime.Now;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
|
|||||||
@ -60,6 +60,10 @@ public class SampleAppService : CollectBusAppService, ISampleAppService, IKafkaS
|
|||||||
[HttpGet]
|
[HttpGet]
|
||||||
public async Task UseSessionPool(long testTime)
|
public async Task UseSessionPool(long testTime)
|
||||||
{
|
{
|
||||||
|
var dataTime = DateTime.Now;
|
||||||
|
|
||||||
|
List<string> values = new List<string>() { $"{dataTime:yy}", $"{dataTime:MM}", $"{dataTime:dd}", $"{dataTime:HH}", $"{dataTime:mm}", };
|
||||||
|
|
||||||
|
|
||||||
ElectricityMeterTreeModel meter = new ElectricityMeterTreeModel()
|
ElectricityMeterTreeModel meter = new ElectricityMeterTreeModel()
|
||||||
{
|
{
|
||||||
@ -74,6 +78,11 @@ public class SampleAppService : CollectBusAppService, ISampleAppService, IKafkaS
|
|||||||
Timestamps = testTime// DateTimeOffset.UtcNow.ToUnixTimeNanoseconds()//testTime.GetDateTimeOffset().ToUnixTimeNanoseconds(),
|
Timestamps = testTime// DateTimeOffset.UtcNow.ToUnixTimeNanoseconds()//testTime.GetDateTimeOffset().ToUnixTimeNanoseconds(),
|
||||||
};
|
};
|
||||||
//ElectricityMeterTreeModelExtension.GetCurrent()
|
//ElectricityMeterTreeModelExtension.GetCurrent()
|
||||||
|
//SourceEntityAccessorFactory.SetCurrent(meter);
|
||||||
|
|
||||||
|
//ElectricityMeterTreeModelAccessor.
|
||||||
|
//TableModelSingleMeasuringEntityExtension
|
||||||
|
//TableModelSingleMeasuringEntityAccessor.GetSystemName(meter);
|
||||||
await _iotDBProvider.InsertAsync(meter);
|
await _iotDBProvider.InsertAsync(meter);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -172,6 +181,9 @@ public class SampleAppService : CollectBusAppService, ISampleAppService, IKafkaS
|
|||||||
[HttpGet]
|
[HttpGet]
|
||||||
public async Task TestTreeModelSingleMeasuringEntity(string measuring, string value, DateTime time)
|
public async Task TestTreeModelSingleMeasuringEntity(string measuring, string value, DateTime time)
|
||||||
{
|
{
|
||||||
|
time = DateTime.Now;
|
||||||
|
//System.Reflection.PropertyInfo;
|
||||||
|
//System.Reflection.FieldInfo
|
||||||
var meter = new TreeModelSingleMeasuringEntity<string>()
|
var meter = new TreeModelSingleMeasuringEntity<string>()
|
||||||
{
|
{
|
||||||
SystemName = "energy",
|
SystemName = "energy",
|
||||||
@ -179,7 +191,7 @@ public class SampleAppService : CollectBusAppService, ISampleAppService, IKafkaS
|
|||||||
DeviceType = "1",
|
DeviceType = "1",
|
||||||
ProjectId = "10059",
|
ProjectId = "10059",
|
||||||
Timestamps = time.GetDateTimeOffset().ToUnixTimeMilliseconds(),
|
Timestamps = time.GetDateTimeOffset().ToUnixTimeMilliseconds(),
|
||||||
SingleMeasuring = new Tuple<string, string>(measuring, value)
|
SingleMeasuring = (measuring, value)
|
||||||
};
|
};
|
||||||
await _iotDBProvider.InsertAsync(meter);
|
await _iotDBProvider.InsertAsync(meter);
|
||||||
}
|
}
|
||||||
@ -192,6 +204,7 @@ public class SampleAppService : CollectBusAppService, ISampleAppService, IKafkaS
|
|||||||
[HttpGet]
|
[HttpGet]
|
||||||
public async Task TestTreeModelSingleMeasuringEntity2(string measuring, int value, DateTime time)
|
public async Task TestTreeModelSingleMeasuringEntity2(string measuring, int value, DateTime time)
|
||||||
{
|
{
|
||||||
|
time = DateTime.Now;
|
||||||
var meter = new TreeModelSingleMeasuringEntity<int>()
|
var meter = new TreeModelSingleMeasuringEntity<int>()
|
||||||
{
|
{
|
||||||
SystemName = "energy",
|
SystemName = "energy",
|
||||||
@ -199,7 +212,7 @@ public class SampleAppService : CollectBusAppService, ISampleAppService, IKafkaS
|
|||||||
DeviceType = "Ammeter",
|
DeviceType = "Ammeter",
|
||||||
ProjectId = "10059",
|
ProjectId = "10059",
|
||||||
Timestamps = time.GetDateTimeOffset().ToUnixTimeMilliseconds(),
|
Timestamps = time.GetDateTimeOffset().ToUnixTimeMilliseconds(),
|
||||||
SingleMeasuring = new Tuple<string, int>(measuring, value)
|
SingleMeasuring = (measuring, value)
|
||||||
};
|
};
|
||||||
await _iotDBProvider.InsertAsync(meter);
|
await _iotDBProvider.InsertAsync(meter);
|
||||||
}
|
}
|
||||||
@ -212,6 +225,8 @@ public class SampleAppService : CollectBusAppService, ISampleAppService, IKafkaS
|
|||||||
[HttpGet]
|
[HttpGet]
|
||||||
public async Task TestTableModelSingleMeasuringEntity(string measuring, string value, DateTime time)
|
public async Task TestTableModelSingleMeasuringEntity(string measuring, string value, DateTime time)
|
||||||
{
|
{
|
||||||
|
time = DateTime.Now;
|
||||||
|
|
||||||
var meter = new TableModelSingleMeasuringEntity<string>()
|
var meter = new TableModelSingleMeasuringEntity<string>()
|
||||||
{
|
{
|
||||||
SystemName = "energy",
|
SystemName = "energy",
|
||||||
@ -219,7 +234,7 @@ public class SampleAppService : CollectBusAppService, ISampleAppService, IKafkaS
|
|||||||
DeviceType = "Ammeter",
|
DeviceType = "Ammeter",
|
||||||
ProjectId = "10059",
|
ProjectId = "10059",
|
||||||
Timestamps = time.GetDateTimeOffset().ToUnixTimeMilliseconds(),
|
Timestamps = time.GetDateTimeOffset().ToUnixTimeMilliseconds(),
|
||||||
SingleColumn = new Tuple<string, string>(measuring, value)
|
SingleColumn = (measuring, value)
|
||||||
};
|
};
|
||||||
_dbContext.UseTableSessionPool = true;
|
_dbContext.UseTableSessionPool = true;
|
||||||
await _iotDBProvider.InsertAsync(meter);
|
await _iotDBProvider.InsertAsync(meter);
|
||||||
@ -233,6 +248,8 @@ public class SampleAppService : CollectBusAppService, ISampleAppService, IKafkaS
|
|||||||
[HttpGet]
|
[HttpGet]
|
||||||
public async Task TestTableModelSingleMeasuringEntity2(string measuring, int value, DateTime time)
|
public async Task TestTableModelSingleMeasuringEntity2(string measuring, int value, DateTime time)
|
||||||
{
|
{
|
||||||
|
time = DateTime.Now;
|
||||||
|
|
||||||
var meter = new TableModelSingleMeasuringEntity<int>()
|
var meter = new TableModelSingleMeasuringEntity<int>()
|
||||||
{
|
{
|
||||||
SystemName = "energy",
|
SystemName = "energy",
|
||||||
@ -240,7 +257,7 @@ public class SampleAppService : CollectBusAppService, ISampleAppService, IKafkaS
|
|||||||
DeviceType = "Ammeter",
|
DeviceType = "Ammeter",
|
||||||
ProjectId = "10059",
|
ProjectId = "10059",
|
||||||
Timestamps = time.GetDateTimeOffset().ToUnixTimeMilliseconds(),
|
Timestamps = time.GetDateTimeOffset().ToUnixTimeMilliseconds(),
|
||||||
SingleColumn = new Tuple<string, int>(measuring, value)
|
SingleColumn = (measuring, value)
|
||||||
};
|
};
|
||||||
_dbContext.UseTableSessionPool = true;
|
_dbContext.UseTableSessionPool = true;
|
||||||
await _iotDBProvider.InsertAsync(meter);
|
await _iotDBProvider.InsertAsync(meter);
|
||||||
|
|||||||
@ -7,8 +7,9 @@ using JiShe.CollectBus.Common.Enums;
|
|||||||
using JiShe.CollectBus.Common.Extensions;
|
using JiShe.CollectBus.Common.Extensions;
|
||||||
using JiShe.CollectBus.Common.Helpers;
|
using JiShe.CollectBus.Common.Helpers;
|
||||||
using JiShe.CollectBus.Common.Models;
|
using JiShe.CollectBus.Common.Models;
|
||||||
|
using JiShe.CollectBus.DataChannels;
|
||||||
|
using JiShe.CollectBus.DataMigration.Options;
|
||||||
using JiShe.CollectBus.GatherItem;
|
using JiShe.CollectBus.GatherItem;
|
||||||
using JiShe.CollectBus.IoTDB.Context;
|
|
||||||
using JiShe.CollectBus.IoTDB.Interface;
|
using JiShe.CollectBus.IoTDB.Interface;
|
||||||
using JiShe.CollectBus.IoTDB.Model;
|
using JiShe.CollectBus.IoTDB.Model;
|
||||||
using JiShe.CollectBus.IoTDB.Options;
|
using JiShe.CollectBus.IoTDB.Options;
|
||||||
@ -17,8 +18,8 @@ using JiShe.CollectBus.IotSystems.Ammeters;
|
|||||||
using JiShe.CollectBus.IotSystems.MeterReadingRecords;
|
using JiShe.CollectBus.IotSystems.MeterReadingRecords;
|
||||||
using JiShe.CollectBus.IotSystems.Watermeter;
|
using JiShe.CollectBus.IotSystems.Watermeter;
|
||||||
using JiShe.CollectBus.Kafka.Internal;
|
using JiShe.CollectBus.Kafka.Internal;
|
||||||
using JiShe.CollectBus.Kafka.Producer;
|
|
||||||
using JiShe.CollectBus.Protocol.Interfaces;
|
using JiShe.CollectBus.Protocol.Interfaces;
|
||||||
|
using JiShe.CollectBus.Protocol.Models;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
using Microsoft.Extensions.Options;
|
using Microsoft.Extensions.Options;
|
||||||
using System;
|
using System;
|
||||||
@ -26,14 +27,6 @@ using System.Collections.Generic;
|
|||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using JiShe.CollectBus.Protocol.Models;
|
|
||||||
using System.Threading.Channels;
|
|
||||||
using static IdentityModel.ClaimComparer;
|
|
||||||
using JiShe.CollectBus.DataChannels;
|
|
||||||
using JiShe.CollectBus.DataMigration.Options;
|
|
||||||
using static System.Runtime.InteropServices.JavaScript.JSType;
|
|
||||||
using static System.Formats.Asn1.AsnWriter;
|
|
||||||
using System.Threading;
|
|
||||||
|
|
||||||
namespace JiShe.CollectBus.ScheduledMeterReading
|
namespace JiShe.CollectBus.ScheduledMeterReading
|
||||||
{
|
{
|
||||||
@ -160,7 +153,7 @@ namespace JiShe.CollectBus.ScheduledMeterReading
|
|||||||
_logger.LogWarning($"电表自动校时 {data.Name} 任务数据构建失败:{data.Serialize()}");
|
_logger.LogWarning($"电表自动校时 {data.Name} 任务数据构建失败:{data.Serialize()}");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
_ = _dataChannelManage.ScheduledMeterTaskWriterAsync(DataChannelManage.TaskDataChannel.Writer, Tuple.Create(ProtocolConst.AmmeterSubscriberWorkerOtherIssuedEventName, tempTask));
|
_ = _dataChannelManage.ScheduledMeterTaskWriterAsync(DataChannelManage.TaskDataChannel.Writer, (ProtocolConst.AmmeterSubscriberWorkerOtherIssuedEventName, tempTask));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
else if (string.Equals(currentTimeStr, _applicationOptions.AutomaticTerminalVersionTime, StringComparison.CurrentCultureIgnoreCase))//集中器版本号读取
|
else if (string.Equals(currentTimeStr, _applicationOptions.AutomaticTerminalVersionTime, StringComparison.CurrentCultureIgnoreCase))//集中器版本号读取
|
||||||
@ -177,7 +170,7 @@ namespace JiShe.CollectBus.ScheduledMeterReading
|
|||||||
_logger.LogWarning($"集中器 {data.Name} 任务数据构建失败:{data.Serialize()}");
|
_logger.LogWarning($"集中器 {data.Name} 任务数据构建失败:{data.Serialize()}");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
_ = _dataChannelManage.ScheduledMeterTaskWriterAsync(DataChannelManage.TaskDataChannel.Writer, Tuple.Create(ProtocolConst.AmmeterSubscriberWorkerOtherIssuedEventName, tempTask));
|
_ = _dataChannelManage.ScheduledMeterTaskWriterAsync(DataChannelManage.TaskDataChannel.Writer, (ProtocolConst.AmmeterSubscriberWorkerOtherIssuedEventName, tempTask));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
else if (string.Equals(currentTimeStr, _applicationOptions.AutomaticTelematicsModuleTime, StringComparison.CurrentCultureIgnoreCase))//SIM卡读取
|
else if (string.Equals(currentTimeStr, _applicationOptions.AutomaticTelematicsModuleTime, StringComparison.CurrentCultureIgnoreCase))//SIM卡读取
|
||||||
@ -194,7 +187,7 @@ namespace JiShe.CollectBus.ScheduledMeterReading
|
|||||||
_logger.LogWarning($"集中器 {data.Name} 任务数据构建失败:{data.Serialize()}");
|
_logger.LogWarning($"集中器 {data.Name} 任务数据构建失败:{data.Serialize()}");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
_ = _dataChannelManage.ScheduledMeterTaskWriterAsync(DataChannelManage.TaskDataChannel.Writer, Tuple.Create(ProtocolConst.AmmeterSubscriberWorkerOtherIssuedEventName, tempTask));
|
_ = _dataChannelManage.ScheduledMeterTaskWriterAsync(DataChannelManage.TaskDataChannel.Writer, (ProtocolConst.AmmeterSubscriberWorkerOtherIssuedEventName, tempTask));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
else if (string.Equals(currentTimeStr, _applicationOptions.AutomaticTelematicsModuleTime, StringComparison.CurrentCultureIgnoreCase))//月冻结
|
else if (string.Equals(currentTimeStr, _applicationOptions.AutomaticTelematicsModuleTime, StringComparison.CurrentCultureIgnoreCase))//月冻结
|
||||||
@ -211,7 +204,7 @@ namespace JiShe.CollectBus.ScheduledMeterReading
|
|||||||
_logger.LogWarning($"电表 {data.Name} 任务数据构建失败:{data.Serialize()}");
|
_logger.LogWarning($"电表 {data.Name} 任务数据构建失败:{data.Serialize()}");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
_ = _dataChannelManage.ScheduledMeterTaskWriterAsync(DataChannelManage.TaskDataChannel.Writer, Tuple.Create(ProtocolConst.AmmeterSubscriberWorkerOtherIssuedEventName, tempTask));
|
_ = _dataChannelManage.ScheduledMeterTaskWriterAsync(DataChannelManage.TaskDataChannel.Writer, (ProtocolConst.AmmeterSubscriberWorkerOtherIssuedEventName, tempTask));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
else if (string.Equals(currentTimeStr, _applicationOptions.AutomaticDayFreezeTime, StringComparison.CurrentCultureIgnoreCase))//日冻结
|
else if (string.Equals(currentTimeStr, _applicationOptions.AutomaticDayFreezeTime, StringComparison.CurrentCultureIgnoreCase))//日冻结
|
||||||
@ -228,7 +221,7 @@ namespace JiShe.CollectBus.ScheduledMeterReading
|
|||||||
_logger.LogWarning($"电表 {data.Name} 任务数据构建失败:{data.Serialize()}");
|
_logger.LogWarning($"电表 {data.Name} 任务数据构建失败:{data.Serialize()}");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
_ = _dataChannelManage.ScheduledMeterTaskWriterAsync(DataChannelManage.TaskDataChannel.Writer, Tuple.Create(ProtocolConst.AmmeterSubscriberWorkerOtherIssuedEventName, tempTask));
|
_ = _dataChannelManage.ScheduledMeterTaskWriterAsync(DataChannelManage.TaskDataChannel.Writer, (ProtocolConst.AmmeterSubscriberWorkerOtherIssuedEventName, tempTask));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -262,7 +255,7 @@ namespace JiShe.CollectBus.ScheduledMeterReading
|
|||||||
//_logger.LogWarning($"电表 {data.Name} 任务数据构建失败:{data.Serialize()}");
|
//_logger.LogWarning($"电表 {data.Name} 任务数据构建失败:{data.Serialize()}");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
_ = _dataChannelManage.ScheduledMeterTaskWriterAsync(DataChannelManage.TaskDataChannel.Writer, Tuple.Create(ProtocolConst.AmmeterSubscriberWorkerAutoValveControlIssuedEventName, tempTask));
|
_ = _dataChannelManage.ScheduledMeterTaskWriterAsync(DataChannelManage.TaskDataChannel.Writer, (ProtocolConst.AmmeterSubscriberWorkerFifteenMinuteIssuedEventName, tempTask));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
else if (meteryType == MeterTypeEnum.WaterMeter.ToString())
|
else if (meteryType == MeterTypeEnum.WaterMeter.ToString())
|
||||||
@ -281,7 +274,7 @@ namespace JiShe.CollectBus.ScheduledMeterReading
|
|||||||
_logger.LogWarning($"水表 {data.Name} 任务数据构建失败:{data.Serialize()}");
|
_logger.LogWarning($"水表 {data.Name} 任务数据构建失败:{data.Serialize()}");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
_ = _dataChannelManage.ScheduledMeterTaskWriterAsync(DataChannelManage.TaskDataChannel.Writer, Tuple.Create(ProtocolConst.WatermeterSubscriberWorkerAutoReadingIssuedEventName, tempTask));
|
_ = _dataChannelManage.ScheduledMeterTaskWriterAsync(DataChannelManage.TaskDataChannel.Writer, (ProtocolConst.WatermeterSubscriberWorkerAutoReadingIssuedEventName, tempTask));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -307,7 +300,7 @@ namespace JiShe.CollectBus.ScheduledMeterReading
|
|||||||
_logger.LogWarning($"{nameof(AmmeterScheduledAutoValveControl)}电表定时阀控没有可操作的任务");
|
_logger.LogWarning($"{nameof(AmmeterScheduledAutoValveControl)}电表定时阀控没有可操作的任务");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
_ = _dataChannelManage.ScheduledMeterTaskWriterAsync(DataChannelManage.TaskDataChannel.Writer, Tuple.Create(ProtocolConst.AmmeterSubscriberWorkerAutoValveControlIssuedEventName, autoValveControlTask));
|
_ = _dataChannelManage.ScheduledMeterTaskWriterAsync(DataChannelManage.TaskDataChannel.Writer, (ProtocolConst.AmmeterSubscriberWorkerAutoValveControlIssuedEventName, autoValveControlTask));
|
||||||
}
|
}
|
||||||
|
|
||||||
#region 电表采集处理
|
#region 电表采集处理
|
||||||
@ -329,10 +322,12 @@ namespace JiShe.CollectBus.ScheduledMeterReading
|
|||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public virtual async Task InitAmmeterCacheData(string gatherCode = "")
|
public virtual async Task InitAmmeterCacheData(string gatherCode = "")
|
||||||
{
|
{
|
||||||
// 创建取消令牌源
|
//return;
|
||||||
var cts = new CancellationTokenSource();
|
|
||||||
|
|
||||||
_ = _dataChannelManage.ScheduledMeterTaskReadingAsync(DataChannelManage.TaskDataChannel.Reader, cts.Token);
|
// 创建取消令牌源
|
||||||
|
//var cts = new CancellationTokenSource();
|
||||||
|
|
||||||
|
_ = _dataChannelManage.ScheduledMeterTaskReadingAsync(DataChannelManage.TaskDataChannel.Reader );
|
||||||
|
|
||||||
//此处代码不要删除
|
//此处代码不要删除
|
||||||
#if DEBUG
|
#if DEBUG
|
||||||
@ -742,7 +737,7 @@ namespace JiShe.CollectBus.ScheduledMeterReading
|
|||||||
ItemCode = tempItem,
|
ItemCode = tempItem,
|
||||||
DataTimeMark = new Protocol.DataTimeMark()
|
DataTimeMark = new Protocol.DataTimeMark()
|
||||||
{
|
{
|
||||||
Density = ammeterInfo.TimeDensity,//todo 转换成协议的值
|
Density = ammeterInfo.TimeDensity.GetDensity(),//转换成协议的值
|
||||||
Point = 1,
|
Point = 1,
|
||||||
DataTime = timestamps,
|
DataTime = timestamps,
|
||||||
}
|
}
|
||||||
@ -1352,7 +1347,6 @@ namespace JiShe.CollectBus.ScheduledMeterReading
|
|||||||
}
|
}
|
||||||
|
|
||||||
List<MeterReadingTelemetryPacketInfo> taskList = new List<MeterReadingTelemetryPacketInfo>();
|
List<MeterReadingTelemetryPacketInfo> taskList = new List<MeterReadingTelemetryPacketInfo>();
|
||||||
var metadata = await _dbProvider.GetMetadata<MeterReadingTelemetryPacketInfo>();
|
|
||||||
|
|
||||||
var itemCode = T37612012PacketItemCodeConst.AFN09HFN01H;
|
var itemCode = T37612012PacketItemCodeConst.AFN09HFN01H;
|
||||||
//var subItemCode = T6452007PacketItemCodeConst.C08;
|
//var subItemCode = T6452007PacketItemCodeConst.C08;
|
||||||
|
|||||||
@ -1,12 +1,10 @@
|
|||||||
using JiShe.CollectBus.Analyzers.Shared;
|
using JiShe.CollectBus.Analyzers.Shared;
|
||||||
using JiShe.CollectBus.IoTDB.Attribute;
|
using JiShe.CollectBus.IoTDB.Attributes;
|
||||||
using JiShe.CollectBus.IoTDB.Enums;
|
|
||||||
using JiShe.CollectBus.IoTDB.Model;
|
using JiShe.CollectBus.IoTDB.Model;
|
||||||
|
|
||||||
namespace JiShe.CollectBus.Ammeters
|
namespace JiShe.CollectBus.Ammeters
|
||||||
{
|
{
|
||||||
[EntityType(EntityTypeEnum.TableModel)]
|
[SourceAnalyzers(EntityTypeEnum.TableModel)]
|
||||||
[SourceAnalyzers]
|
|
||||||
public class ElectricityMeter : IoTEntity
|
public class ElectricityMeter : IoTEntity
|
||||||
{
|
{
|
||||||
[ATTRIBUTEColumn]
|
[ATTRIBUTEColumn]
|
||||||
@ -31,7 +29,7 @@ namespace JiShe.CollectBus.Ammeters
|
|||||||
public double Current { get; set; }
|
public double Current { get; set; }
|
||||||
|
|
||||||
[FIELDColumn]
|
[FIELDColumn]
|
||||||
public double Power => Voltage * Current;
|
public double Power { get; set; }
|
||||||
|
|
||||||
[FIELDColumn]
|
[FIELDColumn]
|
||||||
public double? Currentd { get; set; }
|
public double? Currentd { get; set; }
|
||||||
|
|||||||
@ -1,12 +1,11 @@
|
|||||||
using JiShe.CollectBus.Analyzers.Shared;
|
using JiShe.CollectBus.Analyzers.Shared;
|
||||||
using JiShe.CollectBus.IoTDB.Attribute;
|
using JiShe.CollectBus.IoTDB.Attributes;
|
||||||
using JiShe.CollectBus.IoTDB.Enums;
|
|
||||||
using JiShe.CollectBus.IoTDB.Model;
|
using JiShe.CollectBus.IoTDB.Model;
|
||||||
|
using System;
|
||||||
|
|
||||||
namespace JiShe.CollectBus.Ammeters
|
namespace JiShe.CollectBus.Ammeters
|
||||||
{
|
{
|
||||||
[EntityType(EntityTypeEnum.TreeModel)]
|
[SourceAnalyzers(EntityTypeEnum.TreeModel)]
|
||||||
[SourceAnalyzers]
|
|
||||||
public class ElectricityMeterTreeModel : IoTEntity
|
public class ElectricityMeterTreeModel : IoTEntity
|
||||||
{
|
{
|
||||||
[ATTRIBUTEColumn]
|
[ATTRIBUTEColumn]
|
||||||
@ -31,9 +30,11 @@ namespace JiShe.CollectBus.Ammeters
|
|||||||
public double Current { get; set; }
|
public double Current { get; set; }
|
||||||
|
|
||||||
[FIELDColumn]
|
[FIELDColumn]
|
||||||
public double Power => Voltage * Current;
|
public double Power { get; set; }
|
||||||
|
|
||||||
[FIELDColumn]
|
[FIELDColumn]
|
||||||
public double? Currentd { get; set; }
|
public double? Currentd { get; set; }
|
||||||
|
|
||||||
|
public ValueTuple<int, string> TupleData { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,6 +1,5 @@
|
|||||||
using JiShe.CollectBus.Analyzers.Shared;
|
using JiShe.CollectBus.Analyzers.Shared;
|
||||||
using JiShe.CollectBus.IoTDB.Attribute;
|
using JiShe.CollectBus.IoTDB.Attributes;
|
||||||
using JiShe.CollectBus.IoTDB.Enums;
|
|
||||||
using JiShe.CollectBus.IoTDB.Model;
|
using JiShe.CollectBus.IoTDB.Model;
|
||||||
using System;
|
using System;
|
||||||
|
|
||||||
@ -9,8 +8,7 @@ namespace JiShe.CollectBus.IotSystems.MeterReadingRecords
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 抄读任务数据
|
/// 抄读任务数据
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[EntityType(EntityTypeEnum.TableModel)]
|
[SourceAnalyzers(EntityTypeEnum.TableModel)]
|
||||||
[SourceAnalyzers]
|
|
||||||
public class MeterReadingTelemetryPacketInfo : IoTEntity
|
public class MeterReadingTelemetryPacketInfo : IoTEntity
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@ -74,7 +74,7 @@ namespace JiShe.CollectBus.Protocol.Contracts.Protocol.Dto
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 抄读值
|
/// 抄读值
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public T? DataValue { get; set; }
|
public T? DataValue { get; set; } = default;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
60
shared/JiShe.CollectBus.Analyzers.Shared/EntityMemberInfo.cs
Normal file
60
shared/JiShe.CollectBus.Analyzers.Shared/EntityMemberInfo.cs
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
namespace JiShe.CollectBus.Analyzers.Shared
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 实体成员信息
|
||||||
|
/// </summary>
|
||||||
|
public sealed class EntityMemberInfo
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 名称或者路径
|
||||||
|
/// </summary>
|
||||||
|
public string NameOrPath { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 声明的类型
|
||||||
|
/// </summary>
|
||||||
|
public Type DeclaredType { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 声明的类型的名称
|
||||||
|
/// </summary>
|
||||||
|
public string DeclaredTypeName { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取值
|
||||||
|
/// </summary>
|
||||||
|
public Func<object, object> Getter { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 设置值
|
||||||
|
/// </summary>
|
||||||
|
public Action<object, object> Setter { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 自定义Attribute集合
|
||||||
|
/// </summary>
|
||||||
|
public List<Attribute> CustomAttributes { get; set; }
|
||||||
|
|
||||||
|
|
||||||
|
public EntityMemberInfo(
|
||||||
|
string nameOrPath,
|
||||||
|
Type declaredType,
|
||||||
|
string declaredTypeName,
|
||||||
|
Func<object, object> getter,
|
||||||
|
Action<object, object> setter)
|
||||||
|
{
|
||||||
|
NameOrPath = nameOrPath;
|
||||||
|
this.DeclaredType = declaredType;
|
||||||
|
DeclaredTypeName = declaredTypeName;
|
||||||
|
Getter = getter;
|
||||||
|
Setter = setter;
|
||||||
|
}
|
||||||
|
|
||||||
|
public object GetValue(object entity) => Getter(entity);
|
||||||
|
public void SetValue(object entity, object value) => Setter(entity, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,24 +1,27 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace JiShe.CollectBus.IoTDB.Enums
|
namespace JiShe.CollectBus.Analyzers.Shared
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// IoTDB实体类型枚举
|
/// 实体类型枚举
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public enum EntityTypeEnum
|
public enum EntityTypeEnum
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 树模型
|
/// IoTDB树模型
|
||||||
/// </summary>
|
/// </summary>
|
||||||
TreeModel = 1,
|
TreeModel = 1,
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 表模型
|
/// IoTDB表模型
|
||||||
/// </summary>
|
/// </summary>
|
||||||
TableModel = 2,
|
TableModel = 2,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 其他情况
|
||||||
|
/// </summary>
|
||||||
|
Other = 3
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1,11 +1,22 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Reflection;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
|
|
||||||
namespace JiShe.CollectBus.Analyzers
|
namespace JiShe.CollectBus.Analyzers.Shared
|
||||||
{
|
{
|
||||||
public interface ISourceAnalyzersProvider<T>
|
public interface ISourceEntityAccessor<T>
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 实体类名称
|
||||||
|
/// </summary>
|
||||||
|
string EntityName { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 实体类型
|
||||||
|
/// </summary>
|
||||||
|
EntityTypeEnum? EntityType { get;}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 获取属性值
|
/// 获取属性值
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -23,18 +34,13 @@ namespace JiShe.CollectBus.Analyzers
|
|||||||
void SetPropertyValue(T entity, string propertyName, object value);
|
void SetPropertyValue(T entity, string propertyName, object value);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 判断是否是元组属性
|
/// 属性名称集合
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="propertyName"></param>
|
List<string> PropertyNameList { get; }
|
||||||
/// <returns></returns>
|
|
||||||
bool IsTupleProperty(string propertyName);
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 获取元组属性值
|
/// 属性信息集合
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="entity"></param>
|
List<EntityMemberInfo> MemberList { get; }
|
||||||
/// <param name="tuplePropertyName"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
(object Item1, object Item2) GetTupleParts(T entity, string tuplePropertyName);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user