Merge branch 'dev' into zhy_feat_dev_v10

This commit is contained in:
zenghongyao 2025-05-12 17:09:52 +08:00
commit fed56f33ff
9 changed files with 218 additions and 30 deletions

View File

@ -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()

View File

@ -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>

View File

@ -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>

View File

@ -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

View File

@ -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; }
} }
} }

View File

@ -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; }
} }
} }

View File

@ -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>

View File

@ -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) 197协议3007协议
/// </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; }
}
}

View File

@ -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; }
} }
} }