修复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 entityType = prop.ContainingType.ToDisplayString();//entity 实体类型名称
|
||||||
var propType = prop.Type;//实体属性的类型
|
var propType = prop.Type;//实体属性的类型
|
||||||
var propTypeName = propType.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat);
|
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()
|
var propAttributes = prop.GetAttributes()
|
||||||
|
|||||||
@ -589,7 +589,10 @@ namespace JiShe.CollectBus.IoTDB.Provider
|
|||||||
for (int i = 0; i < metadata.Processors.Count; i++)
|
for (int i = 0; i < metadata.Processors.Count; i++)
|
||||||
{
|
{
|
||||||
var value = record.Values[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);
|
results.Add(entity);
|
||||||
@ -615,9 +618,7 @@ namespace JiShe.CollectBus.IoTDB.Provider
|
|||||||
if (member.NameOrPath.Contains(".Item")) continue;
|
if (member.NameOrPath.Contains(".Item")) continue;
|
||||||
|
|
||||||
// 类型名称处理
|
// 类型名称处理
|
||||||
Type declaredType = member.DeclaredType;
|
string declaredTypeName = member.DeclaredTypeName;
|
||||||
var underlyingType = Nullable.GetUnderlyingType(declaredType);
|
|
||||||
string declaredTypeName = underlyingType?.Name ?? member.DeclaredTypeName;
|
|
||||||
|
|
||||||
// 特性查询优化
|
// 特性查询优化
|
||||||
var attributes = member.CustomAttributes ?? Enumerable.Empty<Attribute>();
|
var attributes = member.CustomAttributes ?? Enumerable.Empty<Attribute>();
|
||||||
@ -630,15 +631,15 @@ namespace JiShe.CollectBus.IoTDB.Provider
|
|||||||
ColumnInfo? column = null;
|
ColumnInfo? column = null;
|
||||||
if (tagAttr != 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)
|
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)
|
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
|
var item2Member = accessor.MemberList
|
||||||
.First(m => m.NameOrPath == $"{column.Name}.Item2");
|
.First(m => m.NameOrPath == $"{column.Name}.Item2");
|
||||||
processor.ValueGetter = (obj) => {
|
processor.ValueGetter = (obj) =>
|
||||||
|
{
|
||||||
object rawValue = item2Member.Getter(obj);
|
object rawValue = item2Member.Getter(obj);
|
||||||
return processor.GetConverter(rawValue);
|
return processor.GetConverter(rawValue);
|
||||||
};
|
};
|
||||||
@ -724,7 +726,8 @@ namespace JiShe.CollectBus.IoTDB.Provider
|
|||||||
{
|
{
|
||||||
// 获取对应的成员访问器
|
// 获取对应的成员访问器
|
||||||
var member = accessor.MemberList.First(m => m.NameOrPath == column.Name);
|
var member = accessor.MemberList.First(m => m.NameOrPath == column.Name);
|
||||||
processor.ValueGetter = (obj) => {
|
processor.ValueGetter = (obj) =>
|
||||||
|
{
|
||||||
object rawValue = member.Getter(obj);
|
object rawValue = member.Getter(obj);
|
||||||
return processor.GetConverter(rawValue);
|
return processor.GetConverter(rawValue);
|
||||||
};
|
};
|
||||||
@ -793,7 +796,7 @@ namespace JiShe.CollectBus.IoTDB.Provider
|
|||||||
{
|
{
|
||||||
return declaredTypeName switch
|
return declaredTypeName switch
|
||||||
{
|
{
|
||||||
"DATETIME" => value => ((DateTime)value).GetDateTimeOffset().ToUnixTimeNanoseconds(),
|
"DATETIME" => value => value != null ? ((DateTime)value).GetDateTimeOffset().ToUnixTimeNanoseconds() : null,
|
||||||
_ => value => value
|
_ => value => value
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@ -805,7 +808,7 @@ namespace JiShe.CollectBus.IoTDB.Provider
|
|||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
private Func<object, object> SetterConverter(string columnName) =>
|
private Func<object, object> SetterConverter(string columnName) =>
|
||||||
columnName.ToLower().EndsWith("time")
|
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;
|
: value => value;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@ -87,8 +87,9 @@ public class SampleAppService : CollectBusAppService, ISampleAppService, IKafkaS
|
|||||||
|
|
||||||
//ElectricityMeterTreeModelAccessor.
|
//ElectricityMeterTreeModelAccessor.
|
||||||
//TableModelSingleMeasuringEntityExtension
|
//TableModelSingleMeasuringEntityExtension
|
||||||
//TableModelSingleMeasuringEntityAccessor.GetSystemName(meter);
|
//TableModelSingleMeasuringEntityAccessor.GetSystemName(meter);
|
||||||
await _iotDBProvider.InsertAsync(meter);
|
//ElectricityMeterAccessor
|
||||||
|
await _iotDBProvider.InsertAsync(meter);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -124,10 +125,29 @@ public class SampleAppService : CollectBusAppService, ISampleAppService, IKafkaS
|
|||||||
MeterModel = "DDZY-1980",
|
MeterModel = "DDZY-1980",
|
||||||
ProjectId = "10059",
|
ProjectId = "10059",
|
||||||
Voltage = 10,
|
Voltage = 10,
|
||||||
|
CurrentdDateTime = DateTime.Now,
|
||||||
Timestamps = DateTimeOffset.Now.ToUnixTimeNanoseconds(),
|
Timestamps = DateTimeOffset.Now.ToUnixTimeNanoseconds(),
|
||||||
};
|
};
|
||||||
await _iotDBProvider.InsertAsync(meter);
|
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>
|
/// <summary>
|
||||||
|
|||||||
@ -371,8 +371,8 @@ namespace JiShe.CollectBus.ScheduledMeterReading
|
|||||||
|
|
||||||
timer1.Stop();
|
timer1.Stop();
|
||||||
_logger.LogError($"电表初始化读取数据总共花费时间{timer1.ElapsedMilliseconds}毫秒");
|
_logger.LogError($"电表初始化读取数据总共花费时间{timer1.ElapsedMilliseconds}毫秒");
|
||||||
DeviceGroupBalanceControl.InitializeCache(focusAddressDataLista, _kafkaOptions.NumPartitions);
|
//DeviceGroupBalanceControl.InitializeCache(focusAddressDataLista, _kafkaOptions.NumPartitions);
|
||||||
return;
|
//return;
|
||||||
#else
|
#else
|
||||||
var meterInfos = await GetAmmeterInfoList(gatherCode);
|
var meterInfos = await GetAmmeterInfoList(gatherCode);
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
using JiShe.CollectBus.Analyzers.Shared;
|
using JiShe.CollectBus.Analyzers.Shared;
|
||||||
using JiShe.CollectBus.IoTDB.Attributes;
|
using JiShe.CollectBus.IoTDB.Attributes;
|
||||||
using JiShe.CollectBus.IoTDB.Model;
|
using JiShe.CollectBus.IoTDB.Model;
|
||||||
|
using System;
|
||||||
|
|
||||||
namespace JiShe.CollectBus.Ammeters
|
namespace JiShe.CollectBus.Ammeters
|
||||||
{
|
{
|
||||||
@ -33,5 +34,8 @@ namespace JiShe.CollectBus.Ammeters
|
|||||||
|
|
||||||
[FIELDColumn]
|
[FIELDColumn]
|
||||||
public double? Currentd { get; set; }
|
public double? Currentd { get; set; }
|
||||||
|
|
||||||
|
[FIELDColumn]
|
||||||
|
public DateTime? CurrentdDateTime { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -34,7 +34,5 @@ namespace JiShe.CollectBus.Ammeters
|
|||||||
|
|
||||||
[FIELDColumn]
|
[FIELDColumn]
|
||||||
public double? Currentd { get; set; }
|
public double? Currentd { get; set; }
|
||||||
|
|
||||||
public ValueTuple<int, string> TupleData { get; set; }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -80,11 +80,6 @@ namespace JiShe.CollectBus.IotSystems.Ammeters
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public string Password { get; set; }
|
public string Password { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 采集时间间隔(分钟,如15)
|
|
||||||
/// </summary>
|
|
||||||
public int TimeDensity { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 该电表方案下采集项,JSON格式,如:["0D_80","0D_80"]
|
/// 该电表方案下采集项,JSON格式,如:["0D_80","0D_80"]
|
||||||
/// </summary>
|
/// </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>
|
/// </summary>
|
||||||
public string FocusAddress { get; set;}
|
public string FocusAddress { get; set;}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 采集时间间隔(分钟,如15)
|
||||||
|
/// </summary>
|
||||||
|
public int TimeDensity { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user