修复IoTDB可空类型转换赋值失败的问题
This commit is contained in:
parent
1c8d672170
commit
fa84f42ca2
@ -531,7 +531,14 @@ namespace JiShe.CollectBus.IncrementalGenerator
|
||||
var entityType = prop.ContainingType.ToDisplayString();//entity 实体类型名称
|
||||
var propType = prop.Type;//实体属性的类型
|
||||
var propTypeName = propType.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat);
|
||||
var declaredTypeName = propType.Name; // 直接获取类型名称(如 "Int32")
|
||||
// var declaredTypeName = propType.Name; // 直接获取类型名称(如 "Int32")
|
||||
// 处理可空类型,获取底层具体类型名称
|
||||
var declaredTypeName = propType switch
|
||||
{
|
||||
INamedTypeSymbol { OriginalDefinition.SpecialType: SpecialType.System_Nullable_T } nullableType =>
|
||||
nullableType.TypeArguments[0].Name, // 提取如 "Int32"
|
||||
_ => propType.Name
|
||||
};
|
||||
|
||||
// 处理主属性
|
||||
var propAttributes = prop.GetAttributes()
|
||||
|
||||
@ -283,7 +283,7 @@ namespace JiShe.CollectBus.IoTDB.Provider
|
||||
|
||||
};
|
||||
stopwatch2.Stop();
|
||||
|
||||
|
||||
//int totalPageCount = (int)Math.Ceiling((double)result.TotalCount / options.PageSize);
|
||||
|
||||
if (result.Items.Count() < result.PageSize)
|
||||
@ -400,7 +400,7 @@ namespace JiShe.CollectBus.IoTDB.Provider
|
||||
{
|
||||
tempColumnNames[i] = (string)processor.SingleMeasuringNameGetter(entity);
|
||||
}
|
||||
|
||||
|
||||
// 获取并转换值
|
||||
values[row][i] = processor.ValueGetter(entity);
|
||||
}
|
||||
@ -576,7 +576,7 @@ namespace JiShe.CollectBus.IoTDB.Provider
|
||||
|
||||
var accessor = SourceEntityAccessorFactory.GetAccessor<T>();
|
||||
var memberCache = BuildMemberCache(accessor);
|
||||
|
||||
|
||||
|
||||
while (dataSet.HasNext() && results.Count < pageSize)
|
||||
{
|
||||
@ -589,9 +589,12 @@ namespace JiShe.CollectBus.IoTDB.Provider
|
||||
for (int i = 0; i < metadata.Processors.Count; i++)
|
||||
{
|
||||
var value = record.Values[i];
|
||||
metadata.Processors[i].ValueSetter(entity, value);
|
||||
if (!(value is System.DBNull))
|
||||
{
|
||||
metadata.Processors[i].ValueSetter(entity, value);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
results.Add(entity);
|
||||
|
||||
}
|
||||
@ -614,10 +617,8 @@ namespace JiShe.CollectBus.IoTDB.Provider
|
||||
// 过滤元组子项
|
||||
if (member.NameOrPath.Contains(".Item")) continue;
|
||||
|
||||
// 类型名称处理
|
||||
Type declaredType = member.DeclaredType;
|
||||
var underlyingType = Nullable.GetUnderlyingType(declaredType);
|
||||
string declaredTypeName = underlyingType?.Name ?? member.DeclaredTypeName;
|
||||
// 类型名称处理
|
||||
string declaredTypeName = member.DeclaredTypeName;
|
||||
|
||||
// 特性查询优化
|
||||
var attributes = member.CustomAttributes ?? Enumerable.Empty<Attribute>();
|
||||
@ -630,15 +631,15 @@ namespace JiShe.CollectBus.IoTDB.Provider
|
||||
ColumnInfo? column = null;
|
||||
if (tagAttr != null)
|
||||
{
|
||||
column = new ColumnInfo(member.NameOrPath, ColumnCategory.TAG, GetDataTypeFromTypeName(declaredTypeName), false, member.DeclaredTypeName);
|
||||
column = new ColumnInfo(member.NameOrPath, ColumnCategory.TAG, GetDataTypeFromTypeName(member.DeclaredTypeName), false, member.DeclaredTypeName);
|
||||
}
|
||||
else if (attrColumn != null)
|
||||
{
|
||||
column = new ColumnInfo(member.NameOrPath, ColumnCategory.ATTRIBUTE, GetDataTypeFromTypeName(declaredTypeName), false, member.DeclaredTypeName);
|
||||
column = new ColumnInfo(member.NameOrPath, ColumnCategory.ATTRIBUTE, GetDataTypeFromTypeName(member.DeclaredTypeName), false, member.DeclaredTypeName);
|
||||
}
|
||||
else if (fieldColumn != null)
|
||||
{
|
||||
column = new ColumnInfo(member.NameOrPath, ColumnCategory.FIELD, GetDataTypeFromTypeName(declaredTypeName), false, member.DeclaredTypeName);
|
||||
column = new ColumnInfo(member.NameOrPath, ColumnCategory.FIELD, GetDataTypeFromTypeName(member.DeclaredTypeName), false, member.DeclaredTypeName);
|
||||
}
|
||||
|
||||
// 单测模式处理
|
||||
@ -715,7 +716,8 @@ namespace JiShe.CollectBus.IoTDB.Provider
|
||||
|
||||
var item2Member = accessor.MemberList
|
||||
.First(m => m.NameOrPath == $"{column.Name}.Item2");
|
||||
processor.ValueGetter = (obj) => {
|
||||
processor.ValueGetter = (obj) =>
|
||||
{
|
||||
object rawValue = item2Member.Getter(obj);
|
||||
return processor.GetConverter(rawValue);
|
||||
};
|
||||
@ -724,7 +726,8 @@ namespace JiShe.CollectBus.IoTDB.Provider
|
||||
{
|
||||
// 获取对应的成员访问器
|
||||
var member = accessor.MemberList.First(m => m.NameOrPath == column.Name);
|
||||
processor.ValueGetter = (obj) => {
|
||||
processor.ValueGetter = (obj) =>
|
||||
{
|
||||
object rawValue = member.Getter(obj);
|
||||
return processor.GetConverter(rawValue);
|
||||
};
|
||||
@ -793,7 +796,7 @@ namespace JiShe.CollectBus.IoTDB.Provider
|
||||
{
|
||||
return declaredTypeName switch
|
||||
{
|
||||
"DATETIME" => value => ((DateTime)value).GetDateTimeOffset().ToUnixTimeNanoseconds(),
|
||||
"DATETIME" => value => value != null ? ((DateTime)value).GetDateTimeOffset().ToUnixTimeNanoseconds() : null,
|
||||
_ => value => value
|
||||
};
|
||||
}
|
||||
@ -803,9 +806,9 @@ namespace JiShe.CollectBus.IoTDB.Provider
|
||||
/// </summary>
|
||||
/// <param name="columnName"></param>
|
||||
/// <returns></returns>
|
||||
private Func<object, object> SetterConverter(string columnName) =>
|
||||
private Func<object, object> SetterConverter(string columnName) =>
|
||||
columnName.ToLower().EndsWith("time")
|
||||
? value => new DateTime(Convert.ToInt64(value), DateTimeKind.Utc)
|
||||
? value => value != null ? TimestampHelper.ConvertToDateTime(Convert.ToInt64(value), TimestampUnit.Nanoseconds) : null
|
||||
: value => value;
|
||||
|
||||
/// <summary>
|
||||
|
||||
@ -87,8 +87,9 @@ public class SampleAppService : CollectBusAppService, ISampleAppService, IKafkaS
|
||||
|
||||
//ElectricityMeterTreeModelAccessor.
|
||||
//TableModelSingleMeasuringEntityExtension
|
||||
//TableModelSingleMeasuringEntityAccessor.GetSystemName(meter);
|
||||
await _iotDBProvider.InsertAsync(meter);
|
||||
//TableModelSingleMeasuringEntityAccessor.GetSystemName(meter);
|
||||
//ElectricityMeterAccessor
|
||||
await _iotDBProvider.InsertAsync(meter);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -124,10 +125,29 @@ public class SampleAppService : CollectBusAppService, ISampleAppService, IKafkaS
|
||||
MeterModel = "DDZY-1980",
|
||||
ProjectId = "10059",
|
||||
Voltage = 10,
|
||||
CurrentdDateTime = DateTime.Now,
|
||||
Timestamps = DateTimeOffset.Now.ToUnixTimeNanoseconds(),
|
||||
};
|
||||
await _iotDBProvider.InsertAsync(meter);
|
||||
|
||||
QueryCondition conditions = new QueryCondition()
|
||||
{
|
||||
Field = "DeviceId",
|
||||
Operator = "=",
|
||||
Value = meter.DeviceId
|
||||
};
|
||||
|
||||
|
||||
var query = new IoTDBQueryOptions()
|
||||
{
|
||||
TableNameOrTreePath = nameof(ElectricityMeter),
|
||||
PageIndex = 1,
|
||||
PageSize = 1,
|
||||
Conditions = new List<QueryCondition>() { conditions },
|
||||
};
|
||||
|
||||
var pageResult = await _iotDBProvider.QueryAsync<ElectricityMeter>(query);
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@ -371,8 +371,8 @@ namespace JiShe.CollectBus.ScheduledMeterReading
|
||||
|
||||
timer1.Stop();
|
||||
_logger.LogError($"电表初始化读取数据总共花费时间{timer1.ElapsedMilliseconds}毫秒");
|
||||
DeviceGroupBalanceControl.InitializeCache(focusAddressDataLista, _kafkaOptions.NumPartitions);
|
||||
return;
|
||||
//DeviceGroupBalanceControl.InitializeCache(focusAddressDataLista, _kafkaOptions.NumPartitions);
|
||||
//return;
|
||||
#else
|
||||
var meterInfos = await GetAmmeterInfoList(gatherCode);
|
||||
#endif
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
using JiShe.CollectBus.Analyzers.Shared;
|
||||
using JiShe.CollectBus.IoTDB.Attributes;
|
||||
using JiShe.CollectBus.IoTDB.Model;
|
||||
using System;
|
||||
|
||||
namespace JiShe.CollectBus.Ammeters
|
||||
{
|
||||
@ -33,5 +34,8 @@ namespace JiShe.CollectBus.Ammeters
|
||||
|
||||
[FIELDColumn]
|
||||
public double? Currentd { get; set; }
|
||||
|
||||
[FIELDColumn]
|
||||
public DateTime? CurrentdDateTime { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@ -34,7 +34,5 @@ namespace JiShe.CollectBus.Ammeters
|
||||
|
||||
[FIELDColumn]
|
||||
public double? Currentd { get; set; }
|
||||
|
||||
public ValueTuple<int, string> TupleData { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@ -79,12 +79,7 @@ namespace JiShe.CollectBus.IotSystems.Ammeters
|
||||
/// 电表密码
|
||||
/// </summary>
|
||||
public string Password { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 采集时间间隔(分钟,如15)
|
||||
/// </summary>
|
||||
public int TimeDensity { get; set; }
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 该电表方案下采集项,JSON格式,如:["0D_80","0D_80"]
|
||||
/// </summary>
|
||||
|
||||
@ -0,0 +1,156 @@
|
||||
using FreeSql.DataAnnotations;
|
||||
using JiShe.CollectBus.Analyzers.Shared;
|
||||
using JiShe.CollectBus.Common.Enums;
|
||||
using JiShe.CollectBus.Common.Models;
|
||||
using JiShe.CollectBus.IoTDB.Attributes;
|
||||
using JiShe.CollectBus.IoTDB.Model;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace JiShe.CollectBus.IotSystems.Devices
|
||||
{
|
||||
/// <summary>
|
||||
/// 设备缓存信息
|
||||
/// </summary>
|
||||
public class DeviceCacheInfo : DeviceCacheBasicModel
|
||||
{
|
||||
/// <summary>
|
||||
/// 关系映射标识,用于ZSet的Member字段和Set的Value字段,具体值可以根据不同业务场景进行定义
|
||||
/// </summary>
|
||||
[Column(IsIgnore = true)]
|
||||
public override string MemberId => $"{FocusAddress}:{MeteringCode}";
|
||||
|
||||
/// <summary>
|
||||
/// ZSet排序索引分数值,具体值可以根据不同业务场景进行定义,例如时间戳
|
||||
/// </summary>
|
||||
[Column(IsIgnore = true)]
|
||||
public override long ScoreValue => Common.Helpers.CommonHelper.GetFocusScores(FocusAddress, MeteringCode);
|
||||
|
||||
/// <summary>
|
||||
/// 标记信息设备类型
|
||||
/// </summary>
|
||||
[Column(IsIgnore = true)]
|
||||
public MeterTypeEnum MeterType { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 电表名称
|
||||
/// </summary>
|
||||
public string Name { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 集中器地址
|
||||
/// </summary>
|
||||
public string Address { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 集中器区域代码
|
||||
/// </summary>
|
||||
public string AreaCode { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 电表类别 (1单相、2三相三线、3三相四线),
|
||||
/// 07协议: 开合闸指令(1A开闸断电,1C单相表合闸,1B多相表合闸) 645 2007 表
|
||||
/// 97协议://true(合闸);false(跳闸) 545 1997 没有单相多相 之分 "true" ? "9966" : "3355"
|
||||
/// </summary>
|
||||
public int TypeName { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 跳合闸状态字段: 0 合闸,1 跳闸
|
||||
/// 电表:TripState (0 合闸-通电, 1 断开、跳闸);
|
||||
/// </summary>
|
||||
public int TripState { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 规约 -电表default(30) 1:97协议,30:07协议
|
||||
/// </summary>
|
||||
public int? Protocol { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 一个集中器下的[MeteringCode]必须唯一。 PN
|
||||
/// </summary>
|
||||
public int MeteringCode { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 电表通信地址
|
||||
/// </summary>
|
||||
public string AmmerterAddress { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 波特率 default(2400)
|
||||
/// </summary>
|
||||
public int Baudrate { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// MeteringPort 端口就几个可以枚举。
|
||||
/// </summary>
|
||||
public int MeteringPort { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 电表密码
|
||||
/// </summary>
|
||||
public string Password { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 该电表方案下采集项,JSON格式,如:["0D_80","0D_80"]
|
||||
/// </summary>
|
||||
public string ItemCodes { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// State表状态:
|
||||
/// 0新装(未下发),1运行(档案下发成功时设置状态值1), 2暂停, 100销表(销表后是否重新启用)
|
||||
/// 特定:State -1 已删除
|
||||
/// </summary>
|
||||
public int State { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 是否自动采集(0:主动采集,1:自动采集)
|
||||
/// </summary>
|
||||
public int AutomaticReport { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 该电表方案下采集项编号
|
||||
/// </summary>
|
||||
public string DataTypes { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 品牌型号
|
||||
/// </summary>
|
||||
public string BrandType { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 采集器编号
|
||||
/// </summary>
|
||||
public string GatherCode { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 是否特殊表,1是特殊电表
|
||||
/// </summary>
|
||||
public int Special { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 费率类型,单、多 (SingleRate :单费率(单相表1),多费率(其他0) ,与TypeName字段无关)
|
||||
/// SingleRate ? "单" : "复"
|
||||
/// [SingleRate] --0 复费率 false , 1 单费率 true (与PayPlanID保持一致)
|
||||
///对应 TB_PayPlan.Type: 1复费率,2单费率
|
||||
/// </summary>
|
||||
public bool SingleRate { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 项目ID
|
||||
/// </summary>
|
||||
public int ProjectID { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 数据库业务ID
|
||||
/// </summary>
|
||||
public int DatabaseBusiID { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 是否异常集中器 0:正常,1异常
|
||||
/// </summary>
|
||||
public int AbnormalState { get; set; }
|
||||
}
|
||||
}
|
||||
@ -40,5 +40,10 @@ namespace JiShe.CollectBus.Common.Models
|
||||
/// 集中器地址
|
||||
/// </summary>
|
||||
public string FocusAddress { get; set;}
|
||||
|
||||
/// <summary>
|
||||
/// 采集时间间隔(分钟,如15)
|
||||
/// </summary>
|
||||
public int TimeDensity { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user