From 3de5990573473ba6dad2b9f61b1d597740cd6ff2 Mon Sep 17 00:00:00 2001 From: TianMaiCheng <746290578@qq.com> Date: Tue, 3 Feb 2026 08:54:16 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BLWLogProduce/EnergyConsumption.cs | 70 +++- .../Redis_to_Kafka_System_Documentation.md | 307 ++++++++++++++++++ BLWLogProduce/Services/KafkaProduce.cs | 55 +++- BLWLogServer/Services/KafkaConsume.cs | 13 +- CommonEntity/Iot.cs | 4 + CommonEntity/TSLog.cs | 84 ++++- CommonEntity/UDPPackage.cs | 19 +- DAL/New_Models/FcsorderDatum.cs | 25 ++ DAL/New_Models/RicsContext.cs | 37 +++ DAL/New_Models/TbSysHotel.cs | 4 + Redis定阅/bin/Debug/net8.0/CommonEntity.dll | Bin 93696 -> 99840 bytes Redis定阅/bin/Debug/net8.0/CommonEntity.pdb | Bin 75676 -> 77932 bytes Redis定阅/bin/Debug/net8.0/CommonTools.dll | Bin 22528 -> 22528 bytes Redis定阅/bin/Debug/net8.0/CommonTools.pdb | Bin 23148 -> 23148 bytes Redis定阅/bin/Debug/net8.0/Redis定阅.dll | Bin 7168 -> 7168 bytes Redis定阅/bin/Debug/net8.0/Redis定阅.exe | Bin 151552 -> 151552 bytes Redis定阅/bin/Debug/net8.0/Redis定阅.pdb | Bin 15448 -> 15448 bytes .../obj/Debug/net8.0/Redis定阅.AssemblyInfo.cs | 2 +- .../net8.0/Redis定阅.AssemblyInfoInputs.cache | 2 +- ...阅.GeneratedMSBuildEditorConfig.editorconfig | 2 +- .../Redis定阅.csproj.AssemblyReference.cache | Bin 39889 -> 37284 bytes Redis定阅/obj/Debug/net8.0/Redis定阅.dll | Bin 7168 -> 7168 bytes Redis定阅/obj/Debug/net8.0/Redis定阅.pdb | Bin 15448 -> 15448 bytes Redis定阅/obj/Debug/net8.0/apphost.exe | Bin 151552 -> 151552 bytes Redis定阅/obj/Debug/net8.0/ref/Redis定阅.dll | Bin 6656 -> 6656 bytes .../obj/Debug/net8.0/refint/Redis定阅.dll | Bin 6656 -> 6656 bytes .../Release/net8.0/Redis定阅.AssemblyInfo.cs | 2 +- .../net8.0/Redis定阅.AssemblyInfoInputs.cache | 2 +- .../Redis定阅.csproj.AssemblyReference.cache | Bin 39897 -> 37292 bytes .../Controllers/ValuesController.cs | 249 ++++++++++++++ .../PublishProfiles/FolderProfile1.pubxml | 20 ++ .../FolderProfile1.pubxml.user | 9 + UseSQLQueryData/UseSQLQueryData.csproj.user | 2 +- 33 files changed, 865 insertions(+), 43 deletions(-) create mode 100644 BLWLogProduce/Redis_to_Kafka_System_Documentation.md create mode 100644 DAL/New_Models/FcsorderDatum.cs create mode 100644 UseSQLQueryData/Properties/PublishProfiles/FolderProfile1.pubxml create mode 100644 UseSQLQueryData/Properties/PublishProfiles/FolderProfile1.pubxml.user diff --git a/BLWLogProduce/EnergyConsumption.cs b/BLWLogProduce/EnergyConsumption.cs index d836069..3fb728a 100644 --- a/BLWLogProduce/EnergyConsumption.cs +++ b/BLWLogProduce/EnergyConsumption.cs @@ -32,21 +32,22 @@ namespace BLWData.Entity { "bHZlGAogASgFIoABChZTaW5nbGVQb3dlckNoYW5uZWxEYXRhEg8KB2FkZHJl", "c3MYASABKAkSDgoGZGlhbnlhGAIgASgBEg8KB2RpYW5saXUYAyABKAESDgoG", "Z29uZ2x2GAQgASgBEg8KB25lbmdoYW8YBSABKAESEwoLem9uZ25lbmdoYW8Y", - "BiABKAEihAMKEUVuZXJneUNvbnN1bXB0aW9uEhEKCUhvdGVsQ29kZRgBIAEo", + "BiABKAEilgMKEUVuZXJneUNvbnN1bXB0aW9uEhEKCUhvdGVsQ29kZRgBIAEo", "AxISCgpIb3N0TnVtYmVyGAIgASgJEgsKA01hYxgDIAEoCRIQCghFbmRQb2lu", - "dBgEIAEoCRIPCgdWZXJzaW9uGAUgASgJEhIKCklzVGFrZUNhcmQYBiABKAgS", + "dBgEIAEoCRIPCgdWZXJzaW9uGAUgASgJEhIKCklzVGFrZUNhcmQYBiABKAUS", "QAoQUG93ZXJDaGFubmVsTGlzdBgHIAMoCzImLkJMV0RhdGEuRW50aXR5LlNp", "bmdsZVBvd2VyQ2hhbm5lbERhdGESEgoKQ3JlYXRlVGltZRgIIAEoAxISCgpS", "b29tTnVtYmVyGAkgASgJEhEKCUNhcmJvblZJUBgKIAEoBRIUCgxJZGVudGl0", "eUluZm8YCyABKAUSNAoQRGV2aWNlU3RhdHVzTGlzdBgMIAMoCzIaLkJMV0Rh", "dGEuRW50aXR5LkRldmljZURhdGESEQoJQ2FyZEV2ZW50GA0gASgFEhQKDElz", - "SW5zZXJ0Q2FyZBgOIAEoBRISCgpQTVNfU3RhdHVzGA8gASgJYgZwcm90bzM=")); + "SW5zZXJ0Q2FyZBgOIAEoBRISCgpQTVNfU3RhdHVzGA8gASgJEhAKCEJyaWdo", + "dF9HGBAgASgFYgZwcm90bzM=")); descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, new pbr::FileDescriptor[] { }, new pbr::GeneratedClrTypeInfo(null, null, new pbr::GeneratedClrTypeInfo[] { new pbr::GeneratedClrTypeInfo(typeof(global::BLWData.Entity.DeviceData), global::BLWData.Entity.DeviceData.Parser, new[]{ "HostID", "DeviceType", "Address", "Status", "Brightness", "CurrentTemp", "SettingTemp", "FanSpeed", "Mode", "Valve" }, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::BLWData.Entity.SinglePowerChannelData), global::BLWData.Entity.SinglePowerChannelData.Parser, new[]{ "Address", "Dianya", "Dianliu", "Gonglv", "Nenghao", "Zongnenghao" }, null, null, null, null), - new pbr::GeneratedClrTypeInfo(typeof(global::BLWData.Entity.EnergyConsumption), global::BLWData.Entity.EnergyConsumption.Parser, new[]{ "HotelCode", "HostNumber", "Mac", "EndPoint", "Version", "IsTakeCard", "PowerChannelList", "CreateTime", "RoomNumber", "CarbonVIP", "IdentityInfo", "DeviceStatusList", "CardEvent", "IsInsertCard", "PMSStatus" }, null, null, null, null) + new pbr::GeneratedClrTypeInfo(typeof(global::BLWData.Entity.EnergyConsumption), global::BLWData.Entity.EnergyConsumption.Parser, new[]{ "HotelCode", "HostNumber", "Mac", "EndPoint", "Version", "IsTakeCard", "PowerChannelList", "CreateTime", "RoomNumber", "CarbonVIP", "IdentityInfo", "DeviceStatusList", "CardEvent", "IsInsertCard", "PMSStatus", "BrightG" }, null, null, null, null) })); } #endregion @@ -1023,6 +1024,7 @@ namespace BLWData.Entity { cardEvent_ = other.cardEvent_; isInsertCard_ = other.isInsertCard_; pMSStatus_ = other.pMSStatus_; + brightG_ = other.brightG_; _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); } @@ -1094,10 +1096,10 @@ namespace BLWData.Entity { /// Field number for the "IsTakeCard" field. public const int IsTakeCardFieldNumber = 6; - private bool isTakeCard_; + private int isTakeCard_; [global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] - public bool IsTakeCard { + public int IsTakeCard { get { return isTakeCard_; } set { isTakeCard_ = value; @@ -1210,6 +1212,18 @@ namespace BLWData.Entity { } } + /// Field number for the "Bright_G" field. + public const int BrightGFieldNumber = 16; + private int brightG_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int BrightG { + get { return brightG_; } + set { + brightG_ = value; + } + } + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] public override bool Equals(object other) { @@ -1240,6 +1254,7 @@ namespace BLWData.Entity { if (CardEvent != other.CardEvent) return false; if (IsInsertCard != other.IsInsertCard) return false; if (PMSStatus != other.PMSStatus) return false; + if (BrightG != other.BrightG) return false; return Equals(_unknownFields, other._unknownFields); } @@ -1252,7 +1267,7 @@ namespace BLWData.Entity { if (Mac.Length != 0) hash ^= Mac.GetHashCode(); if (EndPoint.Length != 0) hash ^= EndPoint.GetHashCode(); if (Version.Length != 0) hash ^= Version.GetHashCode(); - if (IsTakeCard != false) hash ^= IsTakeCard.GetHashCode(); + if (IsTakeCard != 0) hash ^= IsTakeCard.GetHashCode(); hash ^= powerChannelList_.GetHashCode(); if (CreateTime != 0L) hash ^= CreateTime.GetHashCode(); if (RoomNumber.Length != 0) hash ^= RoomNumber.GetHashCode(); @@ -1262,6 +1277,7 @@ namespace BLWData.Entity { if (CardEvent != 0) hash ^= CardEvent.GetHashCode(); if (IsInsertCard != 0) hash ^= IsInsertCard.GetHashCode(); if (PMSStatus.Length != 0) hash ^= PMSStatus.GetHashCode(); + if (BrightG != 0) hash ^= BrightG.GetHashCode(); if (_unknownFields != null) { hash ^= _unknownFields.GetHashCode(); } @@ -1300,9 +1316,9 @@ namespace BLWData.Entity { output.WriteRawTag(42); output.WriteString(Version); } - if (IsTakeCard != false) { + if (IsTakeCard != 0) { output.WriteRawTag(48); - output.WriteBool(IsTakeCard); + output.WriteInt32(IsTakeCard); } powerChannelList_.WriteTo(output, _repeated_powerChannelList_codec); if (CreateTime != 0L) { @@ -1334,6 +1350,10 @@ namespace BLWData.Entity { output.WriteRawTag(122); output.WriteString(PMSStatus); } + if (BrightG != 0) { + output.WriteRawTag(128, 1); + output.WriteInt32(BrightG); + } if (_unknownFields != null) { _unknownFields.WriteTo(output); } @@ -1364,9 +1384,9 @@ namespace BLWData.Entity { output.WriteRawTag(42); output.WriteString(Version); } - if (IsTakeCard != false) { + if (IsTakeCard != 0) { output.WriteRawTag(48); - output.WriteBool(IsTakeCard); + output.WriteInt32(IsTakeCard); } powerChannelList_.WriteTo(ref output, _repeated_powerChannelList_codec); if (CreateTime != 0L) { @@ -1398,6 +1418,10 @@ namespace BLWData.Entity { output.WriteRawTag(122); output.WriteString(PMSStatus); } + if (BrightG != 0) { + output.WriteRawTag(128, 1); + output.WriteInt32(BrightG); + } if (_unknownFields != null) { _unknownFields.WriteTo(ref output); } @@ -1423,8 +1447,8 @@ namespace BLWData.Entity { if (Version.Length != 0) { size += 1 + pb::CodedOutputStream.ComputeStringSize(Version); } - if (IsTakeCard != false) { - size += 1 + 1; + if (IsTakeCard != 0) { + size += 1 + pb::CodedOutputStream.ComputeInt32Size(IsTakeCard); } size += powerChannelList_.CalculateSize(_repeated_powerChannelList_codec); if (CreateTime != 0L) { @@ -1449,6 +1473,9 @@ namespace BLWData.Entity { if (PMSStatus.Length != 0) { size += 1 + pb::CodedOutputStream.ComputeStringSize(PMSStatus); } + if (BrightG != 0) { + size += 2 + pb::CodedOutputStream.ComputeInt32Size(BrightG); + } if (_unknownFields != null) { size += _unknownFields.CalculateSize(); } @@ -1476,7 +1503,7 @@ namespace BLWData.Entity { if (other.Version.Length != 0) { Version = other.Version; } - if (other.IsTakeCard != false) { + if (other.IsTakeCard != 0) { IsTakeCard = other.IsTakeCard; } powerChannelList_.Add(other.powerChannelList_); @@ -1502,6 +1529,9 @@ namespace BLWData.Entity { if (other.PMSStatus.Length != 0) { PMSStatus = other.PMSStatus; } + if (other.BrightG != 0) { + BrightG = other.BrightG; + } _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); } @@ -1542,7 +1572,7 @@ namespace BLWData.Entity { break; } case 48: { - IsTakeCard = input.ReadBool(); + IsTakeCard = input.ReadInt32(); break; } case 58: { @@ -1581,6 +1611,10 @@ namespace BLWData.Entity { PMSStatus = input.ReadString(); break; } + case 128: { + BrightG = input.ReadInt32(); + break; + } } } #endif @@ -1621,7 +1655,7 @@ namespace BLWData.Entity { break; } case 48: { - IsTakeCard = input.ReadBool(); + IsTakeCard = input.ReadInt32(); break; } case 58: { @@ -1660,6 +1694,10 @@ namespace BLWData.Entity { PMSStatus = input.ReadString(); break; } + case 128: { + BrightG = input.ReadInt32(); + break; + } } } } diff --git a/BLWLogProduce/Redis_to_Kafka_System_Documentation.md b/BLWLogProduce/Redis_to_Kafka_System_Documentation.md new file mode 100644 index 0000000..e0be1a0 --- /dev/null +++ b/BLWLogProduce/Redis_to_Kafka_System_Documentation.md @@ -0,0 +1,307 @@ +# Redis消息转发到Kafka系统设计与实现 + +## 1. 项目概述 + +本项目是一个消息转发服务,主要功能是将从Redis订阅的各种消息,经过序列化处理后发送到Kafka队列。为了节省网络流量,系统根据不同消息类型采用了两种序列化方式: +- 大部分消息使用MessagePack序列化 +- 特定消息使用Google Protocol Buffer序列化 + +## 2. 系统架构 + +### 2.1 核心组件 + +| 组件 | 功能描述 | 实现文件 | +|------|---------|---------| +| KafkaProduce | 后台服务,负责Redis订阅和Kafka发送 | Services/KafkaProduce.cs | +| MyPublishRedis | Redis发布订阅管理 | Models/MyPublishRedis.cs | +| MessagePack序列化 | 轻量级序列化方案 | 通过MyMessagePacker实现 | +| Protobuf序列化 | 高效二进制序列化方案 | EnergyConsumption.cs, NewActionChangeDataPush.cs | + +### 2.2 数据流图 + +```mermaid +flowchart TD + subgraph 数据来源 + A[Redis消息发布者] + end + + subgraph 消息处理层 + B[Redis订阅] --> C[消息类型判断] + C --> D1[MessagePack序列化] + C --> D2[Protobuf序列化] + end + + subgraph 消息发送层 + D1 --> E[Kafka生产者] + D2 --> E + end + + subgraph 数据去向 + E --> F[Kafka队列] + end +``` + +## 3. 核心功能实现 + +### 3.1 Redis订阅管理 + +系统通过`CSRedisClient`订阅多个Redis通道,每个通道对应不同类型的消息: + +```csharp +// 订阅UDP包数据 +var DingYue = ("redis-udppackage", new Action(async (args) => +{ + try + { + string body = args.Body; + UDPPackage? usa = System.Text.Json.JsonSerializer.Deserialize(body); + // 处理数据... + byte[] bytes = MyMessagePacker.FastSerialize(usa); + // 发送到Kafka... + } + catch (Exception ex) + { + Console.WriteLine(ex.Message); + Console.WriteLine(ex.StackTrace); + } +})); + +// 订阅其他通道... + +// 执行订阅 +CSRedisCacheHelper.redis3.Subscribe(DingYue); +CSRedisCacheHelper.redis3.Subscribe(DingYue1); +// 更多订阅... +``` + + +### 3.2 序列化策略 + +#### 3.2.1 MessagePack序列化 + +大部分消息类型使用MessagePack进行序列化,通过`MyMessagePacker.FastSerialize`方法实现: + +```csharp +// 序列化UDP包数据 +byte[] bytes = MyMessagePacker.FastSerialize(usa); +var dr = await p.ProduceAsync(TopicKey, new Message { Key = DetailKey, Value = bytes }); + +// 序列化房间状态数据 +StepInfo? usa = System.Text.Json.JsonSerializer.Deserialize(body); +byte[] bytes = MyMessagePacker.FastSerialize(usa); +await p.ProduceAsync(TopicKey, new Message { Key = DetailKey, Value = bytes }); +``` + + +#### 3.2.2 Protobuf序列化 + +特定类型的消息(如能耗数据、设备动作数据)使用Protobuf进行序列化: + +```csharp +// 能耗数据使用Protobuf序列化 +EnergyConsumption ese = new EnergyConsumption(); +ese.HotelCode = poo.HotelCode; +ese.HostNumber = poo.HostNumber; +// 设置其他字段... +byte[] data = ese.ToByteArray(); +await p.ProduceAsync(TopicKey1, new Message { Key = DetailKey1, Value = data }); + +// 设备动作数据使用Protobuf序列化 +NewActionChangeDataPush ese = new NewActionChangeDataPush(); +ese.Code = poo.code; +ese.RoomNumber = poo.roomNumber; +// 设置其他字段... +byte[] data = ese.ToByteArray(); +await p.ProduceAsync(TopicKey1, new Message { Key = DetailKey1, Value = data }); +``` + + +### 3.3 Kafka发送实现 + +系统使用Confluent.Kafka客户端库实现Kafka消息发送: + +```csharp +// 初始化Kafka生产者 +string? ipport = Configuration["Kafka:EndPoint"]; +string? user = Configuration["Kafka:UserName"]; +string? pwd = Configuration["Kafka:PassWord"]; +var config = new ProducerConfig +{ + BootstrapServers = ipport, + SecurityProtocol = SecurityProtocol.SaslPlaintext, + SaslMechanism = SaslMechanism.Plain, + SaslUsername = user, + SaslPassword = pwd +}; +var p = new ProducerBuilder(config).Build(); + +// 发送消息 +var dr = await p.ProduceAsync(TopicKey, new Message { Key = DetailKey, Value = bytes }); +``` + + +## 4. 消息类型与处理 + +### 4.1 主要消息类型 + +| 消息类型 | Redis通道 | 序列化方式 | Kafka主题 | 用途 | +|---------|----------|-----------|----------|------| +| UDP包数据 | redis-udppackage | MessagePack | BLWLog_RCU_Topic | 设备通信数据 | +| 房间状态监控 | redis-roomstatus-monitor | MessagePack | BLWLog_RCU_Topic | 房间状态变化 | +| 旁路系统数据 | redis-forksystemdata | MessagePack | BLWLog_RCU_Topic | 旁路系统信息 | +| 能耗数据 | redis-power | Protobuf | BLWLog4BaoJing_RCU_Topic | 能耗统计 | +| 设备动作数据 | redis-action-data | Protobuf | BLWLog4BaoJing_RCU_Topic | 设备操作记录 | +| 在线离线状态 | redis-on_off_line | Protobuf | BLWLog4BaoJing_RCU_Topic | 设备在线状态 | +| 服务状态变化 | redis-serviceinfo_change | MessagePack | BLWLog_RCU_Topic | 服务状态监控 | +| 第三方接口调用 | redis-invoke_httpinterface | MessagePack | BLWLog_RCU_Topic | 接口调用日志 | +| 新版本协议数据 | redis-rcu-* | MessagePack | BLWLog_RCU_Topic | 新协议设备数据 | +| 选住数据 | Redis-XuanZhuKafka | Protobuf | BLWLog4XuanZhu_RCU_Topic | 选住系统数据 | + +### 4.2 消息处理流程 + +1. **消息接收**:通过Redis订阅接收消息 +2. **消息解析**:将JSON格式的消息解析为对应的数据模型 +3. **数据处理**:根据需要对数据进行转换和处理 +4. **序列化**:根据消息类型选择合适的序列化方式 +5. **发送到Kafka**:将序列化后的数据发送到对应的Kafka主题 + +## 5. 序列化方案对比 + +### 5.1 MessagePack vs Protocol Buffer + +| 特性 | MessagePack | Protocol Buffer | +|------|-------------|-----------------| +| 序列化速度 | 非常快 | 快 | +| 序列化大小 | 小 | 非常小 | +| 开发难度 | 低 | 中等(需要定义.proto文件) | +| 类型安全 | 中等 | 高 | +| 适用场景 | 一般消息 | 结构化数据、性能敏感场景 | + +### 5.2 选择策略 + +系统根据以下原则选择序列化方案: +- **MessagePack**:适用于大部分通用消息,开发简单,性能足够 +- **Protocol Buffer**:适用于结构化数据(如能耗数据、设备动作数据),以及对性能和数据大小要求较高的场景 + +## 6. 代码优化建议 + +### 6.1 异常处理优化 + +当前代码中的异常处理较为简单,仅打印异常信息: + +```csharp +try +{ + // 处理逻辑 +} +catch (Exception ex) +{ + Console.WriteLine(ex.Message); + Console.WriteLine(ex.StackTrace); +} +``` + +**优化建议**: +- 使用NLog等日志框架记录详细异常信息 +- 实现重试机制,提高系统可靠性 +- 对不同类型的异常进行分类处理 + +### 6.2 配置管理优化 + +当前Kafka配置直接从Configuration读取: + +```csharp +string? ipport = Configuration["Kafka:EndPoint"]; +string? user = Configuration["Kafka:UserName"]; +string? pwd = Configuration["Kafka:PassWord"]; +``` + +**优化建议**: +- 使用强类型配置类,提高代码可维护性 +- 实现配置热更新机制 +- 添加配置验证逻辑 + +### 6.3 序列化工具封装 + +当前序列化调用较为分散: + +```csharp +// MessagePack序列化 +byte[] bytes = MyMessagePacker.FastSerialize(usa); + +// Protobuf序列化 +byte[] data = ese.ToByteArray(); +``` + +**优化建议**: +- 封装统一的序列化工具类,根据消息类型自动选择序列化方式 +- 提供序列化性能监控 +- 实现序列化缓存机制,提高重复消息的处理速度 + +## 7. 性能与扩展性 + +### 7.1 性能优化 + +- **批量处理**:对相似消息进行批量处理,减少Kafka网络请求 +- **连接池**:使用Redis和Kafka连接池,减少连接建立开销 +- **异步处理**:充分利用异步编程模型,提高系统吞吐量 +- **内存管理**:优化内存使用,减少GC压力 + +### 7.2 扩展性设计 + +- **模块化**:消息处理逻辑模块化,便于添加新的消息类型 +- **插件架构**:支持通过插件方式扩展新的序列化方案 +- **多租户**:支持多租户配置,适应不同场景需求 +- **监控指标**:提供详细的系统运行指标,便于监控和调优 + +## 8. 技术栈 + +| 技术 | 版本/库 | 用途 | +|------|---------|------| +| .NET Core | 6.0+ | 运行环境 | +| Redis | CSRedisClient | 消息订阅 | +| Kafka | Confluent.Kafka | 消息发送 | +| MessagePack | MyMessagePacker | 序列化 | +| Protocol Buffer | Google.Protobuf | 序列化 | +| NLog | NLog | 日志记录 | + +## 9. 部署与运维 + +### 9.1 部署方式 + +- **容器化**:使用Docker容器部署,便于横向扩展 +- **服务编排**:使用Kubernetes管理容器集群 +- **配置管理**:使用配置中心统一管理配置 + +### 9.2 监控与告警 + +- **健康检查**:实现服务健康检查接口 +- **指标监控**:收集Redis订阅、Kafka发送等关键指标 +- **告警机制**:对异常情况及时告警 + +### 9.3 日志管理 + +- **结构化日志**:使用结构化日志格式,便于分析 +- **日志聚合**:使用ELK等日志聚合系统 +- **日志轮转**:实现日志轮转,避免磁盘空间耗尽 + +## 10. 总结 + +本项目实现了一个高效的Redis消息转发到Kafka的系统,通过合理选择序列化方案,在保证性能的同时节省了网络流量。系统架构清晰,模块划分合理,具有良好的扩展性和可维护性。 + +### 10.1 核心优势 + +1. **序列化策略**:根据消息类型选择合适的序列化方案,平衡了性能和开发效率 +2. **异步处理**:充分利用异步编程模型,提高系统吞吐量 +3. **模块化设计**:消息处理逻辑模块化,便于扩展和维护 +4. **可靠性**:通过异常处理和日志记录,提高系统可靠性 + +### 10.2 应用场景 + +本系统适用于以下场景: +- **物联网设备数据**:收集和转发物联网设备产生的大量数据 +- **监控系统**:实时监控和转发各种监控指标 +- **日志聚合**:集中收集和处理分布式系统的日志 +- **数据同步**:在不同系统间实现数据同步 + +通过本系统的实现,不仅解决了Redis到Kafka的消息转发问题,也为类似场景的消息处理提供了参考方案。 \ No newline at end of file diff --git a/BLWLogProduce/Services/KafkaProduce.cs b/BLWLogProduce/Services/KafkaProduce.cs index fb14c96..5d0d5fe 100644 --- a/BLWLogProduce/Services/KafkaProduce.cs +++ b/BLWLogProduce/Services/KafkaProduce.cs @@ -9,6 +9,7 @@ using Google.Protobuf; using MessagePack; using Microsoft.CodeAnalysis.Host.Mef; using Microsoft.Extensions.Caching.Memory; +using Microsoft.Extensions.ObjectPool; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using NLog; @@ -374,14 +375,14 @@ namespace BLWLogProduce.Services { return; } - logger.Error("能耗:" + body); + //logger.Error("能耗:" + body); //string str= Newtonsoft.Json.JsonConvert.SerializeObject(poo); //Console.WriteLine("收到了"+str); - byte[] qf = MyMessagePacker.FastSerialize(poo); + //byte[] qf = MyMessagePacker.FastSerialize(poo); - string TopicKey = KafkaKey.BLWLog_RCU_Topic; - string DetailKey = KafkaKey.UDPPackagePowerMonitor; - await p.ProduceAsync(TopicKey, new Message { Key = DetailKey, Value = qf }); + //string TopicKey = KafkaKey.BLWLog_RCU_Topic; + //string DetailKey = KafkaKey.UDPPackagePowerMonitor; + //await p.ProduceAsync(TopicKey, new Message { Key = DetailKey, Value = qf }); #region 宝镜系统使用的能耗数据结构 @@ -440,6 +441,7 @@ namespace BLWLogProduce.Services ese.IdentityInfo = poo.IdentityInfo; ese.CardEvent = poo.CardEvent; ese.PMSStatus = poo.PMS_Status; + ese.BrightG = poo.Bright_G; byte[] data = ese.ToByteArray(); string TopicKey1 = KafkaKey.BLWLog4BaoJing_RCU_Topic; @@ -514,6 +516,10 @@ namespace BLWLogProduce.Services NewVersionLog? poo = System.Text.Json.JsonSerializer.Deserialize(body); poo.ts_ms = Tools.GetUnixTime_MS(); + if (string.IsNullOrEmpty(poo.hotel_id) || string.IsNullOrEmpty(poo.device_id)) + { + return; + } string TopicKey1 = KafkaKey.BLWLog4NodeJs_RCU_Topic; string DetailKey1 = poo.comm_seq.ToString(); @@ -529,6 +535,35 @@ namespace BLWLogProduce.Services })); + var TSLog_DingYue_0X36 = ("redis-0X36-0X0F", new Action(async (args) => + { + string body = args.Body; + + try + { + DeviceActionData? poo = System.Text.Json.JsonSerializer.Deserialize(body); + poo.ts_ms = Tools.GetUnixTime_MS(); + + if (string.IsNullOrEmpty(poo.hotel_id) || string.IsNullOrEmpty(poo.device_id)) + { + return; + } + string TopicKey1 = KafkaKey.BLWLog4NodeJs_RCU_Action_Topic; + string DetailKey1 = poo.frame_id.ToString(); + + var jsonstr = JsonConvert.SerializeObject(poo); + await p.ProduceAsync(TopicKey1, new Message { Key = DetailKey1, Value = Encoding.UTF8.GetBytes(jsonstr) }); + + } + catch (Exception ex) + { + Console.WriteLine(ex.Message); + Console.WriteLine(ex.StackTrace); + } + })); + + + #region 碳达人 //var DingYue3_1 = ("redis-carbon_trigger", new Action(async (args) => //{ @@ -630,6 +665,8 @@ namespace BLWLogProduce.Services string body = args.Body; CommonEntity.OnOffLineData? usa = System.Text.Json.JsonSerializer.Deserialize(body); + //poo.ts_ms = Tools.GetUnixTime_MS(); + usa.UnixTime = Tools.GetUnixTime_MS(); if (string.IsNullOrEmpty(usa.EndPoint)) { logger.Error("RCUOnOffLine:" + body); @@ -640,6 +677,12 @@ namespace BLWLogProduce.Services logger.Error("RCUOnOffLine:" + body); return; } + + string Key1 = KafkaKey.BLWLog4NodeJs_RCU_OnOffLine_Topic; + string Key2 = usa.HostNumber; + byte[] nnn = Encoding.UTF8.GetBytes(body); + var dr = await p.ProduceAsync(Key1, new Message { Key = Key2, Value = nnn }); + BLWData.Entity.OnOffLineData ese = new BLWData.Entity.OnOffLineData(); ese.HotelCode = usa.HotelCode; ese.HostNumber = usa.HostNumber; @@ -649,7 +692,6 @@ namespace BLWLogProduce.Services ese.Mac = usa.MAC ?? ""; ese.CurrentTime = usa.CurrentTime.ToString("yyyy-MM-dd HH:mm:ss.fff"); - byte[] data = ese.ToByteArray(); string TopicKey1 = KafkaKey.BLWLog4BaoJing_RCU_Topic; string DetailKey1 = KafkaKey.RCUOnLineStatus; @@ -913,6 +955,7 @@ namespace BLWLogProduce.Services //新版本日志 CSRedisCacheHelper.redis3.Subscribe(TSLog_DingYue); + CSRedisCacheHelper.redis3.Subscribe(TSLog_DingYue_0X36); } catch (Exception ex) { diff --git a/BLWLogServer/Services/KafkaConsume.cs b/BLWLogServer/Services/KafkaConsume.cs index b017a77..ca60df7 100644 --- a/BLWLogServer/Services/KafkaConsume.cs +++ b/BLWLogServer/Services/KafkaConsume.cs @@ -200,12 +200,13 @@ namespace BLWLogServer.Services us.HostNumber = UDPPPP.HostNumber; us.Mac = UDPPPP.Mac; us.EndPoint = UDPPPP.EndPoint; - us.V = UDPPPP.V; - us.A = UDPPPP.A; - us.P = UDPPPP.P; - us.Energy_Consumption = UDPPPP.Energy_Consumption; - us.Sum_Energy_Consumption = UDPPPP.Sum_Energy_Consumption; - us.IsTakeCard = UDPPPP.IsTakeCard; + //us.V = UDPPPP.V; + //us.A = UDPPPP.A; + //us.P = UDPPPP.P; + //us.Energy_Consumption = UDPPPP.Energy_Consumption; + //us.Sum_Energy_Consumption = UDPPPP.Sum_Energy_Consumption; + us.NengHaoList = UDPPPP.NengHaoList; + //us.IsTakeCard = UDPPPP.IsTakeCard; us.CreateTime = UDPPPP.CreateTime; us.ReportTime = DateTime.Parse(UDPPPP.ReportTime); diff --git a/CommonEntity/Iot.cs b/CommonEntity/Iot.cs index b86bfd0..a47e5a5 100644 --- a/CommonEntity/Iot.cs +++ b/CommonEntity/Iot.cs @@ -103,6 +103,10 @@ namespace CommonEntity [Id(6)] [Key(6)] public string? RoomNumber { get; set; } + + [Id(7)] + [Key(7)] + public long? UnixTime { get; set; } } diff --git a/CommonEntity/TSLog.cs b/CommonEntity/TSLog.cs index 1156a06..62cbd4f 100644 --- a/CommonEntity/TSLog.cs +++ b/CommonEntity/TSLog.cs @@ -6,6 +6,58 @@ using System.Threading.Tasks; namespace CommonEntity { + + + public class ts_deviceitem + { + public short dev_type { get; set; } + public short dev_addr { get; set; } + public short dev_loop { get; set; } + public int dev_data { get; set; } + } + public class ts_faultitem + { + public short dev_type { get; set; } + public short dev_addr { get; set; } + public short dev_loop { get; set; } + public short error_type { get; set; } + public int error_data { get; set; } + } + public class ts_controlitem + { + public short dev_type { get; set; } + public short dev_addr { get; set; } + public short dev_loop { get; set; } + public short type_l { get; set; } + public int type_h { get; set; } + } + /// + /// 0x36 + /// + public class DeviceActionData + { + public long ts_ms { get; set; } + public string hotel_id { get; set; } + public string room_id { get; set; } + public string device_id { get; set; } + /// + /// "上报" 或 "下发" + /// + public string direction { get; set; } + + public string cmd_word { get; set; } + public int frame_id { get; set; } + public byte[] udp_raw { get; set; } + public int sys_lock_status { get; set; } + + public int report_count { get; set; } + public int fault_count { get; set; } + public List device_list { get; set; } + public List fault_list { get; set; } + public List control_list { get; set; } + + } + /// /// ts 日志 /// @@ -26,15 +78,41 @@ namespace CommonEntity public int comm_seq { get; set; } public long ts_ms { get; set; } + public List electricity { get; set; } + public List air_conditioner { get; set; } public extra_data extra { get; set; } + public int insert_card { get; set; } + public int bright_g { get; set; } + public int version { get; set; } + + } + public class NengHaolog + { + public string address { get; set; } + public double voltage { get; set; } + public double ampere { get; set; } + public double power { get; set; } + public double energy { get; set; } + public double sum_energy { get; set; } + public string phase { get; set; } + } + public class KongTiao + { + public string address { get; set; } + public int state { get; set; } + public int model { get; set; } + public int speed { get; set; } + public int set_temp { get; set; } + public int now_temp { get; set; } + public int solenoid_valve { get; set; } } public class extra_data { public byte[] original_byte { get; set; } - public string source { get; set; } + //public string source { get; set; } public string ver { get; set; } - public object ac { get; set; } - public object meter { get; set; } + //public object ac { get; set; } + //public object meter { get; set; } } } diff --git a/CommonEntity/UDPPackage.cs b/CommonEntity/UDPPackage.cs index fec19b3..fed1f47 100644 --- a/CommonEntity/UDPPackage.cs +++ b/CommonEntity/UDPPackage.cs @@ -35,6 +35,8 @@ namespace CommonEntity /// 心跳包 /// public static string BLWLog4NodeJs_RCU_Topic = "blwlog4Nodejs-rcu-heartbeat-topic"; + public static string BLWLog4NodeJs_RCU_OnOffLine_Topic = "blwlog4Nodejs-rcu-onoffline-topic"; + public static string BLWLog4NodeJs_RCU_Action_Topic = "blwlog4Nodejs-rcu-action-topic"; #endregion @@ -231,7 +233,7 @@ namespace CommonEntity public string? Version { get; set; } [Key(5)] - public bool IsTakeCard { get; set; } + public int IsTakeCard { get; set; } [Key(6)] public List NengHaoList { get; set; } @@ -294,6 +296,9 @@ namespace CommonEntity [Key(15)] public int IsInsertCard { get; set; } + + [Key(16)] + public int Bright_G { get; set; } } [MessagePackObject()] @@ -470,11 +475,13 @@ namespace CommonEntity public string? EndPoint { get; set; } public string? Version { get; set; } public bool IsTakeCard { get; set; } - public double V { get; set; } - public double A { get; set; } - public double P { get; set; } - public double Energy_Consumption { get; set; } - public double Sum_Energy_Consumption { get; set; } + + public List NengHaoList { get; set; } + //public double V { get; set; } + //public double A { get; set; } + //public double P { get; set; } + //public double Energy_Consumption { get; set; } + //public double Sum_Energy_Consumption { get; set; } public long CreateTime { get; set; } public DateTime ReportTime { get; set; } diff --git a/DAL/New_Models/FcsorderDatum.cs b/DAL/New_Models/FcsorderDatum.cs new file mode 100644 index 0000000..5df8db0 --- /dev/null +++ b/DAL/New_Models/FcsorderDatum.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; + +namespace DAL.New_Models; + +public partial class FcsorderDatum +{ + public int Id { get; set; } + + public string? LocationUuid { get; set; } + + public string? ItemUuid { get; set; } + + public string? HotelCode { get; set; } + + public string? HostNumber { get; set; } + + public string? HostRoomnum { get; set; } + + public string? ItemClass { get; set; } + + public byte[]? UpdateTime { get; set; } + + public string? FcsorderUuid { get; set; } +} diff --git a/DAL/New_Models/RicsContext.cs b/DAL/New_Models/RicsContext.cs index fdf62d2..865c419 100644 --- a/DAL/New_Models/RicsContext.cs +++ b/DAL/New_Models/RicsContext.cs @@ -21,6 +21,8 @@ public partial class RicsContext : DbContext public virtual DbSet EcoSettings { get; set; } + public virtual DbSet FcsorderData { get; set; } + public virtual DbSet KongTiaoTimers { get; set; } public virtual DbSet LieEcos { get; set; } @@ -167,6 +169,8 @@ public partial class RicsContext : DbContext public virtual DbSet TftpSets { get; set; } + //protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) + // => optionsBuilder.UseSqlServer("Data Source=DESKTOP-DUNS5K7;Initial Catalog=RICS;User ID=sa;Password=123456;Trust Server Certificate=True"); protected override void OnModelCreating(ModelBuilder modelBuilder) { @@ -218,6 +222,33 @@ public partial class RicsContext : DbContext entity.Property(e => e.StartTime).HasMaxLength(64); }); + modelBuilder.Entity(entity => + { + entity.ToTable("FCSOrderData"); + + entity.Property(e => e.Id).HasColumnName("ID"); + entity.Property(e => e.FcsorderUuid) + .HasMaxLength(64) + .HasColumnName("FCSOrderUUID"); + entity.Property(e => e.HostNumber) + .HasMaxLength(64) + .HasColumnName("HostNUMBER"); + entity.Property(e => e.HostRoomnum) + .HasMaxLength(64) + .HasColumnName("HostROOMNUM"); + entity.Property(e => e.HotelCode).HasMaxLength(64); + entity.Property(e => e.ItemClass).HasMaxLength(64); + entity.Property(e => e.ItemUuid) + .HasMaxLength(64) + .HasColumnName("ItemUUID"); + entity.Property(e => e.LocationUuid) + .HasMaxLength(64) + .HasColumnName("LocationUUID"); + entity.Property(e => e.UpdateTime) + .IsRowVersion() + .IsConcurrencyToken(); + }); + modelBuilder.Entity(entity => { entity.HasKey(e => e.Id).HasName("PK_KongTiaoTimer_1"); @@ -1972,6 +2003,9 @@ public partial class RicsContext : DbContext .HasComment("英文名称") .HasColumnName("EName"); entity.Property(e => e.EndDayTime).HasDefaultValue(18); + entity.Property(e => e.EtvHotelId) + .HasMaxLength(255) + .HasColumnName("ETV_HotelID"); entity.Property(e => e.FaultPushUrl) .HasMaxLength(255) .IsUnicode(false) @@ -2076,6 +2110,9 @@ public partial class RicsContext : DbContext .HasMaxLength(50) .HasColumnName("TWName"); entity.Property(e => e.ValidateDate).HasColumnType("datetime"); + entity.Property(e => e.WelcomeBgm) + .HasMaxLength(255) + .HasColumnName("WelcomeBGM"); entity.Property(e => e.WelcomeSpeech).HasMaxLength(100); entity.Property(e => e.Wxvalidate) .HasMaxLength(50) diff --git a/DAL/New_Models/TbSysHotel.cs b/DAL/New_Models/TbSysHotel.cs index 67adf48..6e0c200 100644 --- a/DAL/New_Models/TbSysHotel.cs +++ b/DAL/New_Models/TbSysHotel.cs @@ -180,6 +180,10 @@ public partial class TbSysHotel public bool? IsNewVersionProtocol { get; set; } + public string? WelcomeBgm { get; set; } + + public string? EtvHotelId { get; set; } + public virtual ICollection TbHosts { get; set; } = new List(); public virtual ICollection TbHotelSeasons { get; set; } = new List(); diff --git a/Redis定阅/bin/Debug/net8.0/CommonEntity.dll b/Redis定阅/bin/Debug/net8.0/CommonEntity.dll index 7f9975510318834914a361c2cbbec1209e4d69af..f0ca105dd94b00c28cb9b73ae2a5d09101e00db9 100644 GIT binary patch literal 99840 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 literal 93696 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

{ z-D*O53?(F%ARe=5!K|o=g$T(Jj49|?&=_(I@g^Gk2KoJne#kIF0w2H!Mn+GCe?GH5 zrnYk5;G()+f#IJw_6jI(_;d3n<1XWo%a;+dNR5yt^w^FZ2Hk+BCiX?|2Evd#Cf|Ic zzdEh#lV~DK6Gmz&NVt}qoYYg03OzZQW2hj4p_~jdQIK&aa&q2WLGGH%NwTGa9I%uV zR~rTKv5}Kab_%lFPEI~LDTrQ2IXUE_Am?4=igDlgk4X;SsUXUcauOM+ zAaQ|m(rK)Mc#oBnj0p;Ia)O*VlgmlY)>EK`|%?6`%^#fI83sngle>Kr>xI41gK122Q{g zcmOZp3j#n02n7)!8Y~4ux^%#J#0ek?q=9UZ2MR$kt0_lZ0jfX^5bDr0fF{rkG&69J z3~50##MZzGxB?I01$;pO2mzrW0z`wQKoIBB`5GiXLxXGtzkw8x1%3zl;20>*&=5!& zf~(*bs0NS41vJPD#IHdU_$rQR67@_?q6>^bJ7BO&lXO6Dg}x(tSI`q&&CtYpnxr4% zAHgs%8jJ&Bne=d)Bm!|%rl3g{BUlN30>6OGAXzNZB59dgWG`^prG+O~i{v6c0#1Un z;3B95Rp1Zs6ue?{-y!}4WLa873kaCM4j3Rd1y;abK;r`3KyTm;e8C711SV$D)6)O6 z$+RqO97KwJcWL7%N1M#X*nF@I2w)xf6>J4NK_=J_4uL{(Ep2idaVfY0gqvvYgGVg+ z9B~7S8xem2irw0z6=(z60vq52x&U|37x?U!4mK3=C@>a;f*D{gSOj8NO&sF&VAF1G zfg~Z=1@?dgKqVHnA}4mYB4@w_Pyz0Mhu{hLORUjFtczHeyagXYR)#JfFkM3S=;9&M zC7S3>cj*#+^d=xTQx`9vF0n*x2Zm(|x_B^jNhe4*&^kz&?;C*3x=CQm{vl?BAE^X$8*cSwV5D*F? zKr~ni1Q0K<;si(%NCVj*4-|r8P!1|U6{rDqY)%8>CeREtb8r}7mLqL$jo1me0uSH? zd_e#R0ihrQ2+?Sk(g4J>$q9&)KpMyfd7uy!gK|&-sz42>0}Y@FGy}~8I0!HU*1!q4 z0*?dit|0aW0U+c6UjI-85g-~Y1pOcc%0?j}(4+jEfz#0fnXk38@@B+Rd0EB>05CNjWQXqhMkN}cE8pzJ0 zSEP^Ml=}EhsgK|3`uLTuPxA8g@#|Qh6re8xUojQ|Kacn_xB>3v=?kP5K^^!T`~yA% zwL|(u2N(i#U=18WXV3$99+Ea4h}aK|1R>&>0hxTrfJ_H2yA1Fv+kiwOUI*uKIp_rX zf)OALEC6f3Hn0zr9hH%X1v1hAWQ8(PeN0AHosf~%r)0zq1QhAu@H#}8gkT|91Ga%| z@Bo;c)*+6-0}KJ3m3Uo)a1igc~8BGW2p+@5@_Xixf8(%72ZtF$Iz*J*4+R@|^5WjAQtfh@Y&fjqlOV_Wj@ zmM!Uio5ptJ^=&)idxysMM7_$M1XR)3ff(L(Ai;MLb|8*K|DGe6dygiZ$hiAXBdjbAIdq+596HX{W+)k;hfX_2+omr zBLUn1Ef~o;U0@XFG(S4A$UebvVvEs9iIW@>gqbp}?-x^t+F32CW^+#0p2Im^JCbvn zpUXMTM{!Q`(VQc1OXhI{v|v8xbb$qlMUK(JiWZ|WoYPq=Ij6H$aZdBAIj4DnbDEFk zoaU9BBkxAyxB*)56X$e+HJsD@TGd0R0NJRN7Q?BW(`manr_<6nr}=cwX+9%ym2Z#k#=cbwDwd(LV8AI@pMk#m}-->Q9k`$4`9`M?d(f{%&6 zc5xl`rN!u1&grtvoYPrE{$I-y8Rs-FPwedKDrmGA)#RM6if`|}ACAt_=A7nrIH&nm zoYTB6=QNLR0l%+@yc^Ny255l+=X8PAoYTCaO0R2xTk?1S>9oF_(`E53 z;rDu)@6S2SdvQ+l-kgi)9>5LIf`OdV1$;QC`5zPYy5|W2Ek^MjpaoMnrwdHwoaUz`UhNSr%xN(i$vK@hmvcHRigTKe=A7o|aZdB|Ij8vr zoFkuj(tV2I3T}+n#3T;y=_chcik6K!+G4nXb2_b%b2{x9=QMwu zbDBSqsMjaJ@Jx%*vx#&2G<3V(V)O>*bgi45)3t6T&h>N^s#=WR<($sC$2pyKpL3dj zAaC{k0dEC=$hj8YV*h~avk!|jU&Fa6{Ryk(257+}&WFJtbAA^7C+GNfjXY`LPdPV2 z{u$@AzK(Mv>`$I^1GL};=X8OWoYVYYoYVX(&S}1$bDIB~bDD499Dj2V@|qi<1#dXl zhQH;U=HGEn^Y1yQ`F}X4`9{uZzKL^z7JT3aXu(I$Y5o)EH2*K>H2;}%n*YK%&41;b z=9~ZD1$>u`|J45fA!!4ZaZW$8$T|NASA!d{hl(z!;9Li;&N+RD*5Dlfo<=m`t;PAc z|4*=>*7pJYipB!koYx?)12<$FS|HzwbNbNga!&uXPY>RPd+PN$$5T%XzBzsU=>o04 z4ImB%hMY&i+i*^=*ret?~(CGYKwxloYQjkssRfphwjI&x0`;&c*S zK!pFgpzDYMW43@P+?jK_Kqt;$!(HGe+%xfmn#Ol`LcTNHl;!tfy)JMw=JYeK8|Iq{ zY(N7O-01-4J-G?=q4I#6v%C)$pl$(oNA4Zy4Yy?Z9C#nN74v?mr*6aQ>yhsZ7do(l zg&63E0bAzu3aLA=3F&YzxFgFK!oA^6%qL+3>YZ4<9(*9&h2_Vh-Ut2z^Ba;2#Fb5m z!@wXEbmb-thIeCr5qau8Sp9PN5V$+bcf*E$@Se^0O`Kt*U z#FGs;p}-#n{n-Ti^~eag7t7OMMgeed=JX|@?!)S*!bib>WO)zxX!s!JTbK`lyCEI~ z0tFQKv4Thp1i^oW92NpU^{)AHniHap1A=0OlsRV(Oz=J^c%EJbVnxFT?x^ z@IdA=T_7V3i(;^NS3D$^=$ZD z=JcVaK9AL>)8GG*7?{rricv5ZzJNLXwuky+Ho*cO4PV0Yv8bO1U&@>wi24dvPY<*J z9>emX@P+V|%qtaiKs9`*ftoOzeg-9K1Qq(3C*X!Ch5D76aFom zOn1T;Z($MBWa{K=csjnpn!3G~evh@2$hC-ar>PwO+XsaW;_EwmB5qIwqt(_3!$^me zC5V@6ZA1G+FH5dYK8F_|-YOX0K^JAxh_>F`R85VXvFwREW%@i#%u*iFgHVG*TL;N~57VXvibTKXw+gh>po=US}Vw*0u zwNnLgn`vS~Y}3WIR%~s;>9{xAlHxG5GfHB`krK2CXKK+dIZLK%k+J8z(GDyMn~r}8 zKOc*D_W5+QHl-yqv`BJkE!qiXHW4)TM!UW|R*cglv;?y5LaiudrWUz((Hm`YX&Bmb zm(s9>R4Z2n$#Gh5sM?H?7fVw{dP=vu89lR0$U8!gsH zd+>5P+KI`fC8Cf>aRapXE{2J5ELv8#gK5)=}@bO!w zmkwmc*vnUr3?Fx*apRLSrYZlv-D#}6WRD;1+{A!k76Z)78k8&JOUDeG-)ukU#y;a7 zxs^T{`<`bkOI{q2q)P~Hxd;7WnDqFw)-sAWeudb|k>$3IN zo*lpVc-Qp4>S<8iv^~D9U%OR8<|4gs%NRYQN|klj(y-bq`pmuKs+ST5SHx!PjzDbV%xEJU8+~e%>VCrlgBS z=Tdyn$2IN!>{b3X>*;`D%iKNc?S`3|PWmzI`t?T}TKQW{wS67jaHr5ed$r7B`1FMf zr$kI2Ic3_ME@Pq>C+3Y?p?*95&Cj-~F5_pY)9}|Y)%MUFH5zW#R{2f4ErwfPsO%zE zh+*#{2yy|0^XZuT${8;r@aZj0SZL@2`k^bb5T?6VW$+ zWTPVwvowx8{GxH>L9p6`#!+gYcE#MCZ&90i{O{G}8#QAtnvYu%5jCfwWMh4B_V|B0 zEUWRHUFcaEdA8pf-J}w2>j7(0s;3(dY}dnIN6+6}yZ7`^jVHH$KRSD#U5QJ-q5;i@ zE4n^iu;Em7k!|k$q1Ru{4|ke3SXi;K|CviVD|3SC_UZcQ_xH_xH0!8yTh!-ik5E4%Z0$NBedo<{7SF;mz1`Q8U7A4ZP$ z{K=&0-h00l1wqjx;+Boi37%U1+wxw|uEehmmo3|EzM#?Uw#o1XAug|*ei_tv*Q?6d z#r=gaW#8R{o&BE;`O-fj+Q0125kJ0|@P5n`qkR*!p8xZzbM?{i{5IX^{g5`N>@Uyq zH>YfkIvF-E-xx6VqPgzj=i!Atmb>2^cD&b%zzqd2-}pOEoZLoZ_sgi5x}yWGJUG5} z-Lg=Pt;wfO7u_l^Oxz~&Oon|Qa5YW=GmW7@1I?=SgtXAU(I`c-8GKW-zL=_ue?xI@MPhQX1v!GMYSs2!Vb$b~mueRbKlI5U<*ld!(=H z4Ot0Ex=)*zwE2W4SwmGsZG;(@WFD^)GvBq*6bjDt&oO;qkw%p;N_YiBJE zwzC&I3oEIU*0ho;t)xoZ0ZwAl_6M=EvynP!Cwpn4y)@B5I+}xYCP!%tNBc#I?LV0% zdVSh1{BO4b_iwKYZT!%rCebKJ+mIK|1CnH*s*1huDQm#|)Kjh%i+e zo!VDS&XKNjj&z+-(xOq)qVwB}CG(|{Mbi95uHxWQX~U(`hRdaS%cXfS(uOh8gw@jR zUG1z%U%*%))%Apd%}AlWw`vO}Z0Gcj={3x=YW1vJdk<%)MEiw{*vpgQPp89K_ZgDm^30 zq3l9OvigyZn%Ex)2x5sKb_d2YAJ05gdPbC?Y~yh08BvC_J28tLcothYlFg4~^B1#u zi`jvfu{*G=lOWx)7&ak>O<2wD#OlscUde8~(pB>HY{B(x!3}J|4XiGKc>?n-Y@ID` z(){1pKEDY+NCV02)+M`0p2lur8oPy=ET75pd)NYd*!%-)` z$6Ux`1BciN53v*Gvkmgu28Y=J4zmLkvJDH_M#tDekFh&<{9Dh~J;ByF(M`I*lhOqW z%9Cv3DRz)k>=qZXm!yatq?jF`m>r;mT|o((ca|OGEW6@!EPsyW%h`d;S=|M3Jwc(o zz!tp7HoV9-yu|LrB@gMum%sIWCBMQBbcM~o`mOIO;rZyTy;#Eq=@ve$2+7us5bB{iXGuvI~03F6b|7_VfQ2 zyG5_Q_3SmQXA9M{4gO{a`kNi7fi2X)9ou~v5A6l%WFOec zKC%fP*@RDQ!%u9(f7xsLFRS~^uK2UGa2%29;)wLL$7x7+EKWnZV{z;)JWfwKV4R`A zCK^g7iZhWOk~kAKv8}X0Tw7LWB^@Zvifz<^c?aeWte(Bc$2qfk&TRe8(!t|8OBWa? zbdw&sxNg!Nh;wHLaAybT%_j6_6Z)|Y`>_oNuz3Tdmm-e6_s0#AKBgE;A3n^b&nM>6 z=Mx+0Bbp5clRl}*I%{{8(p{aBY!$KyZByyfnyF*b8inlT=>P2_8a}D!YXe;xSOOaw z^ab8Dn1D~fvceK|nZ31aZIZH`%s#2oQl_4y?;sneBa;hCa~DEnos*(nklEoNvyk~G x6*$N|F!Z;B%uOaw>fk8zN;+XBYprkCO9S63&%z^w{{z#a!k-;wPqby^{{S&vHoyP? diff --git a/Redis定阅/bin/Debug/net8.0/CommonTools.dll b/Redis定阅/bin/Debug/net8.0/CommonTools.dll index 0a0086026236b2f913c3b591cf9a931fdf955fca..9e672b153dab26d28c430770592941ecc1ecf456 100644 GIT binary patch delta 236 zcmZqJz}T>XaY6?(Z`QYs-FsaGj&%t)hjq>KnpKjwwt3;QKbs?5vp6*j4U*E#4UG&8 z%#uwk5=~8wO@Y87#mFGZ*djSGIoZT0&D_G=GI{bVzc!XFywj#nF7Xc#2z9NSwm~}7 zZ%rJD4Cyb{E0%(FIL-JXaY6@k@8QE6yZ5>XoT`59?T{Pq(Oh0wZtIt_YIB5Z7NH8+OCUQDC~M4+2BZ@iOo4igfNDTGQ-HE&KwcV9O%j9Y JX6MkoOaLmSNR0ph diff --git a/Redis定阅/bin/Debug/net8.0/CommonTools.pdb b/Redis定阅/bin/Debug/net8.0/CommonTools.pdb index 50bbf3f9b11bb6f8d4f07d25ac5cea2d6463755b..d8a2bde2885feaa91d57dfa72a0606e42e3f1825 100644 GIT binary patch delta 1716 zcmZwFe^8Tk9Ki9=$BU0grT>gSm!AK1xvCp2a{$h8p_xH2!vpvuDY)={D zDMOUyO-)ecAGz$F5NGxhyUff{&u5&E96eNK)i*eh(CWZ}NdgkQ1svc*#bQ3hN%*i) z!hy}mlj6W46pmJ+RFseE&`s2b#?Z7N4)~)LNVtRpGm!+vqcoI{%FucA9lDM9dMV(8 zfH8LE!de*@4$JI&T)2dDJ^B_kqE^&_y4d3+{3ato5lq5b)QEmUk5Jw+5>6p263I!} zhHjvxAtaQeOa%#Fqh6#R!%R|=FbBn=9K;DFArTdzpV7Q95_X{Ga1ut4M+9CNC8Jza zjx0#1!t<#3kb(}OTPph(`R~DjJO4i?K^AG>CtV=)-vJUM1)xP$^aGBcP`?=Oy#2-u zNJw@Kk~y;L$1*;<4lkX6s}DGUz{v+3A$_6}c%YFOup-KUzvB$50dHa>L}pwAUa5l9S%}rH4-gW zM;X|fuq~8@tqrS@408lvlmgej@5U8CwN%W`Qk;!aCC)l35$6u67H0?PC+uv%xkswE z;PRmiNFJ2P#Mlcmu>*Tatbecpn-FZmUJkaf`!=@V$b*z+Vr&bg#D2d_izVd-Y_i;h zy(+h0eL`&5f)L>GAWk91ex*=iyA)cs20bnsiHWU+-Lhdbl{Ow9vXsE*!84^88y%{| z>O-~I_D};`6LwRW1$!XehV8@hVIUj?JeU?C#!4fU*rW(8c2|S}TNYu$eiLEAg32cF zv40krfcHQp#+Im*SgXp0T@Yy#@}MFToOmFi11HHG^^MB>ZIhj1XIj-Be(O}{2aA5x zwN2r;4FqKMy!*u0cy`YXPy83v7*{NJ4|QuA+>=*yUA;UzXDIE&aM9jszI^I|_vOV! z-M!tZ8*-v{r-`oBuW~PpmixO_rK>wDjyD;s*33T|ckbS#8}j?2G-&?Txu(IBk53id z8*OVW@h;UX($A?6d&h*IwqrgNx0_og0!W-%PBnq2H)oUz`!u z4EKs=+&Qz#ZFSt{oD!Ql!yL5i-UcF(yfmarn zM<1>1^Gv$ZYSas@$DYtG4XZ2F6`odV+G$f%^4!dxt~J)Kp{7~2B_-KAJD-2_<<2Zi zh1c~Zk^1JgW3Hc;t{V*U_S&0LdNB9b{;qo7deh6&yKfw=7F8*_hfUB9sHb@e&H@=Nc< z3o_E%3-_0L%z3{1ZPV$P^Z8u&*wh_6Hl(G-Z%EEqsLnE`xak~%3s)Bw(+}Mexc0Hw zOow>5__@^*bOS+m5Ofbg_Yw481jFYsvl$;_dQ{b{aSjrT2f-uJs<}|{bPnbW$6A|VUg!w9AZY0dzbYz^j F(?6Pc88-j` delta 1719 zcmZwHeN<9+7{Kx8!j%_8Pt%UED5Fkh>dC@DAz!!}vRY^^%VRkU-)EYgX_}S>y%^3q zrCBS>8lK*)ba}c=i&jHT%Gt_ZG;5VKa~_wQtCqE8ZVz{7`%BLGe18wW3m3R>7&H-s zCZeoxLg|szeJ6MARFy8;oO9lH?$rRn$`|EjS9K-_60SS2z?o0NbUq7sP&JPS8YvI7 zQWm74sWKMKMWJXZNTN#5I=wgBIJi6Q3@(VyU_{sExL<1IyvBt zfDvY8L#%=gWeWQq8)|W;kr_3i>*yBhVvdv0uOJ~fkc3#&gzlhTv@wW;!>AcK1(T48 z+K@bigbK7qNy0biN2D9UI8!8u(PET~Ae4j{v=u!>Gr~yt9JMYW;SHLk!WTvfXalN1 zR}eoO&lAprM6?I}5N`h<|J_({@BjNG1gP!%qzfqj9Uw-{hgGPW?q&Im(@F5k+b_(Z z6yFc7QU!-uvlKjL9iH!qt0y=BSKtX8NOh)w3-MAt)=8$v?@=ggz>8Q+SeX4ToR_nP zu~}?4f(?%y!~_=#Wd1k@@F|>6%d}XlOpkr4lNs%c%)-=$Esz0=3u=EccG#c7#!I!> z0-2tv5o?uMnA))M(zh%=l*@r_-xsp^a9l2CW;xE~ath}HSuD=CrBg-K{cWFRCoqQI(DF zX@4)^h}R%oj4chPu+8B%tf$&Gjtf<45OBedmW)?$bY9O^3-{B*E58q1cA#gfSR}NX zx4my_=+CWM7I3NTxOXu#;bRnli-iJJ+M`+cQqx_&f4`fNsvY zUDDfsrY<{o=U3l%=Of?je(5*oWx8Z`U%tYlG_h8c-V*bbzi9p0Fiw0-+=)w`_l69s z<8Gf?J)@?$PJE`S>Z}eZ1vvum%-UCPC$fxm9+UkkgQA5D#!GBGjh)$rd)9l~$Tqtxa zckG{HjO(yYelEy*-Jm*_Yw4K!o=a4rkFe`)_io#eT;*IA7N@COznipM*A%ECO;hO zF&C%d;fgHHv@wsGY=p^!uFj!SZ$Ltr;78X7CBTQmhKM{afYT+8^QcEvi0!vkCutMh!!Qq%?CwBLf4o zWD|=-Q&VG8Ah1X=GDtGENKQ;nHZe*ww=lO%-pnn?$jEZ(O!ceD0zv@-3qHM;7kf3| zt+Dp{o7F9~t0xx-Why`g!(f6y)md*U(ns3sAJK`M>Fx-EbvSTZDU4i;a_ F0sz*XOojje delta 236 zcmZp$Xt0>j!BV>KQp3ic8GHh3Upq*xU*O?9&9u?liT$UD7mcygDVSieGy3Pa$p=|0D);1``G|hC~KK zh7>TF$dJll0OT10#f=y&fO3{Vb|O&Lm>~^FCo-4<^%w!wfOMt+WzB%RG@zO!2Gh;K H;%iv|J7Gni diff --git a/Redis定阅/bin/Debug/net8.0/Redis定阅.exe b/Redis定阅/bin/Debug/net8.0/Redis定阅.exe index ee768f6d94287a5eeeda4519e2bb864e53d5b518..53881e70b3c828ae93c1db7145c03ed7dffc0b74 100644 GIT binary patch delta 99 zcmZozz}WyqEsR^3zWDeXG8ix&;CJYt~i43MdXbdJnEDMGd gu!PZg=)&+RFq00E-e* diff --git a/Redis定阅/bin/Debug/net8.0/Redis定阅.pdb b/Redis定阅/bin/Debug/net8.0/Redis定阅.pdb index 9cb401db446f5cc62793afdd1750345d802354cf..1676c45ad2107bad84c2f45ae06f060369d8631f 100644 GIT binary patch delta 141 zcmV;80CNA>c-VN5d=#Ma>mL^CpGJXw*X*l=eXG*Ud+M=}a|0lu2Mn2O${Yi(L)f$^ zcRdlugHMLGhMnkM@V~~08f!tbBLuMoLYq6Q{{UbC0RDk&;mY@DL90Nmb$6Rm8$)kx vZEtQ=Z*OdKE@W(M0003s&5fD>pa1}lW|eaKmh?`S<$FHbrF?<2770Q#T%c-VN5d=z@i7bE#3*h#zCUD#(xCq7g8N5Zj?a|0lmr;-Ar0xxV8ucdnf zTi?BHbDv)c$|K+MojLAwHN*F_BLuMoLPuJFl>k5i04Al6ouxZYO_%Tp9(OdIcSCP& vZEtQ=Z*OdKE@W(M0005wyyuJnpa1{}r0wHP6xN?@`PYckuq9ikVeBut*o`UWJ#=rvhTNqw^p H@6tX1Mcx#{ delta 1954 zcmb`HO=uHA6vs26ZM314Mq(&dO*KUjvm~bYNiB67k!ll7A{G%#Odsj$W_R68N}`8) z>O~NB^q?oDT2G3oAb9ZPQIU#z5kU|=S*UoHIJ4c^#%7IMbPkgtv+wu5{%`I~yJw%e zFUu`EPaOZ@&Ro&w1IX)gxe!9_=}HkpK}eMpEERyfR{Z3X(j1zk*KDDMeFgn_*grbi z@ve2Z^*1@aG8i@P>4t19p4{4gJwAW?xn)5eZY1AjKe?#1k;t|V>Z*yk>sn%LLD_-K z$pZT**ytll?j#*&I>}JGMGgPOpv}yE7z(Oh;i>m7v0|yeJiog7D*W*X3&*Gkb>}m! zMOBu8Tu26ZGJQ6Hy4q1d&;k@RRRIMLt79OO@q8C2IqL%PZVj`**mBeblGC~yT3oxa zCB16!bGJcc8%cUXC)t55J0JJn06cr~zR9>>+*&7kg@_P~#G<my30DMBuV`4!>sf8w8b#3|Y=a5QKp6{hC8v%_N?wSUF(^fHcrAO; zjA!QmP3A#|k!>;~6V=)o7cvzML{*sp9fQtGx8EUiy~U&tPmUG8D5N#WNm*Gs2V)%9 z?+_Q@#T(ZlYZNYHoH%E%L(UqLa|})i2Qb!-Vo9cr<(QZarcTpz-n}N~kffaDws!MS zCr?t*L%h-ZY@9{zC%-j!SZ$Ltr;78X7CBTQmhKM{afYT+8^QcEvi0!vkCutMh!!Qq%?CwBLf4o zWD|=-Q&VG8Ah1X=GDtGENKQ;nHZe*ww=lO%-pnn?$jEZ(O!ceD0zv@-3qHM;7kf3| zt+Dp{o7F9~t0xx-Why`g!(f6y)md*U(ns3sAJK`M>Fx-EbvSTZDU4i;a_ F0sz*XOojje delta 236 zcmZp$Xt0>j!BV>KQp3ic8GHh3Upq*xU*O?9&9u?liT$UD7mcygDVSieGy3Pa$p=|0D);1``G|hC~KK zh7>TF$dJll0OT10#f=y&fO3{Vb|O&Lm>~^FCo-4<^%w!wfOMt+WzB%RG@zO!2Gh;K H;%iv|J7Gni diff --git a/Redis定阅/obj/Debug/net8.0/Redis定阅.pdb b/Redis定阅/obj/Debug/net8.0/Redis定阅.pdb index 9cb401db446f5cc62793afdd1750345d802354cf..1676c45ad2107bad84c2f45ae06f060369d8631f 100644 GIT binary patch delta 141 zcmV;80CNA>c-VN5d=#Ma>mL^CpGJXw*X*l=eXG*Ud+M=}a|0lu2Mn2O${Yi(L)f$^ zcRdlugHMLGhMnkM@V~~08f!tbBLuMoLYq6Q{{UbC0RDk&;mY@DL90Nmb$6Rm8$)kx vZEtQ=Z*OdKE@W(M0003s&5fD>pa1}lW|eaKmh?`S<$FHbrF?<2770Q#T%c-VN5d=z@i7bE#3*h#zCUD#(xCq7g8N5Zj?a|0lmr;-Ar0xxV8ucdnf zTi?BHbDv)c$|K+MojLAwHN*F_BLuMoLPuJFl>k5i04Al6ouxZYO_%Tp9(OdIcSCP& vZEtQ=Z*OdKE@W(M0005wyyuJnpa1{}r0wHP&;CJYt~i43MdXbdJnEDMGd gu!PZg=)&+RFq00E-e* diff --git a/Redis定阅/obj/Debug/net8.0/ref/Redis定阅.dll b/Redis定阅/obj/Debug/net8.0/ref/Redis定阅.dll index 36c053abaed659f4ea26943227a03affb0fb41e5..64c6f391836c397030dfc01ce3299b52c6d3c19c 100644 GIT binary patch delta 195 zcmZoLX)u}4!Ln-d%s(4@N|*(F?ldVo{y*l|nNY$%HFN&I&4MiN88`oDRprE#GT|3t z)G#ziN;5Y!GB7YpHnB)FH8nN`0*e$QgCt{%@EeSo{qc3>cCa z(iqGc3>l1oYy$=}hGYg41`CEn22&t329qF`1w#s0MG{cV0;nbth(Riiz`8AfCRj2g KZw?k+%K`u)gEZ>^ delta 195 zcmZoLX)u}4!E$1i!itSOCCma(+EeWx_AQ zsF7rDVwPx_l4zKiYG7z+Vq{@vX_%N|oR*kqYHnm;ZjxeYW|U@_WV*RPUE>Y3wJZRpp*8~m diff --git a/Redis定阅/obj/Debug/net8.0/refint/Redis定阅.dll b/Redis定阅/obj/Debug/net8.0/refint/Redis定阅.dll index 36c053abaed659f4ea26943227a03affb0fb41e5..64c6f391836c397030dfc01ce3299b52c6d3c19c 100644 GIT binary patch delta 195 zcmZoLX)u}4!Ln-d%s(4@N|*(F?ldVo{y*l|nNY$%HFN&I&4MiN88`oDRprE#GT|3t z)G#ziN;5Y!GB7YpHnB)FH8nN`0*e$QgCt{%@EeSo{qc3>cCa z(iqGc3>l1oYy$=}hGYg41`CEn22&t329qF`1w#s0MG{cV0;nbth(Riiz`8AfCRj2g KZw?k+%K`u)gEZ>^ delta 195 zcmZoLX)u}4!E$1i!itSOCCma(+EeWx_AQ zsF7rDVwPx_l4zKiYG7z+Vq{@vX_%N|oR*kqYHnm;ZjxeYW|U@_WV*RPUE>Y3wJZRpp*8~m diff --git a/Redis定阅/obj/Release/net8.0/Redis定阅.AssemblyInfo.cs b/Redis定阅/obj/Release/net8.0/Redis定阅.AssemblyInfo.cs index 477c996..da98011 100644 --- a/Redis定阅/obj/Release/net8.0/Redis定阅.AssemblyInfo.cs +++ b/Redis定阅/obj/Release/net8.0/Redis定阅.AssemblyInfo.cs @@ -14,7 +14,7 @@ using System.Reflection; [assembly: System.Reflection.AssemblyCompanyAttribute("Redis定阅")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+b746a1da1ae011428691ad3faa572074d962f1b5")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+10bf712006c48a55355558d20b38cacc42f7879c")] [assembly: System.Reflection.AssemblyProductAttribute("Redis定阅")] [assembly: System.Reflection.AssemblyTitleAttribute("Redis定阅")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] diff --git a/Redis定阅/obj/Release/net8.0/Redis定阅.AssemblyInfoInputs.cache b/Redis定阅/obj/Release/net8.0/Redis定阅.AssemblyInfoInputs.cache index f2edc70..40091ab 100644 --- a/Redis定阅/obj/Release/net8.0/Redis定阅.AssemblyInfoInputs.cache +++ b/Redis定阅/obj/Release/net8.0/Redis定阅.AssemblyInfoInputs.cache @@ -1 +1 @@ -42dac0bb726664f00389fbf33c124095801676318833f731ebe333b63c56e4b9 +99d430bebbce6c50f252c7cf5891f373a780ce938fba0ebed0f195265e8a331a diff --git a/Redis定阅/obj/Release/net8.0/Redis定阅.csproj.AssemblyReference.cache b/Redis定阅/obj/Release/net8.0/Redis定阅.csproj.AssemblyReference.cache index decc27bc19f01a497a65d562ddf00da62d5756cf..935f56c010e5949423628e0ef289684596a76121 100644 GIT binary patch delta 57 zcmcb)ooUTtrU`j$hu>CRtVozx@@ewT5&_2ei5%vW^H_D+BDsApR3uDZ$odW}?lpO$ Ly831l-lcs2@Gux( delta 1943 zcmZ3pnCa$rrU`j$H)4Nj{0p8~@=2VLn}LCWk&%%vxU#q;HCHdFG_NExH+6DCw&>*h znXL8oKxq(QgpeFSYJ+`zz2H?YE4VOFJGXCYadBdLYCvLgHX}1sJquV5f?&jA*p>xm zQ(ZqS+=pzKl7CT7YGPioUU2H<{du||cPOA~g&7KV7SMjt$>(!KC-dck9Zg8F3yV$X*eG>UPf0$w{4jF;5!g8Cxux zu?4CETyt(geqL%`iEn;NYR=?>beYMwGdWd=F=g^>ZXI2CU}4dL5&o023l#C{m@-o< znBV2GBHWvk!`W35@!7HbQflh1BiF#m0TN+gyL6piV0G zCemtUta(8%q_QB@IX|x~wWuVu2<9?3BF&V8n+eRE$t9WjpdzOrH90deC$lOw1!f#^ zk!ROt1Kc^Jr z7nn)J#*;kEMX41fdailN`CwN~-jE^<@|PWv?h%8U5}ul*=TTBp5L%L%lUV{UH;u6v zgDrTtp~m=R<`u#`LR>sF7O8;Ti!J;N*7`r&v~1m5aBcw;jEt}}5CZabP-=QD4**YBf?EIp diff --git a/UseSQLQueryData/Controllers/ValuesController.cs b/UseSQLQueryData/Controllers/ValuesController.cs index 09494a6..b63d22e 100644 --- a/UseSQLQueryData/Controllers/ValuesController.cs +++ b/UseSQLQueryData/Controllers/ValuesController.cs @@ -1,9 +1,12 @@ using System.Data; using CliWrap; +using DAL.New_Models; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.OutputCaching; using Microsoft.Data.SqlClient; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Caching.Memory; using NLog; using RestSharp; using static System.Runtime.InteropServices.JavaScript.JSType; @@ -15,6 +18,252 @@ namespace UseSQLQueryData.Controllers public class ValuesController : ControllerBase { public static string SqlConnectionString = "server=WIN-061EVIHKD86\\BLW;database=CRICS;uid=sa;pwd=pass@123$%^;TrustServerCertificate=True;"; + //public static string SqlConnectionString = "Data Source=DESKTOP-DUNS5K7;Initial Catalog=RICS;User ID=sa;Password=123456;Trust Server Certificate=True"; + + public RicsContext db { get; set; } + public IMemoryCache _memorycache { get; set; } + public ValuesController(RicsContext context, IMemoryCache cache) + { + this.db = context; + this._memorycache = cache; + } + public record hotelinfo + { + public string HotelID { get; set; } + public string? HotelCode { get; set; } + public string? HotelName { get; set; } + } + + public record hostinfo + { + public string ID { get; set; } + public string HotelID { get; set; } + public string RoomTypeID { get; set; } + public string? RoomNumber { get; set; } + public string? HostNumber { get; set; } + public string? MAC { get; set; } + } + public record roomtype_info + { + public string ID { get; set; } + public string HotelID { get; set; } + public string? RoomTypeName { get; set; } + } + public record roomtype_modalinfo + { + public string ID { get; set; } + public string RoomTypeID { get; set; } + public string? ModalAddress { get; set; } + public string? Type { get; set; } + public string? Name { get; set; } + } + + ///

+ /// 获取酒店列表 + /// + /// + [OutputCache()] + public async Task GetHotelList() + { + ReturnInfo returnInfo = new ReturnInfo(); + //return returnInfo; + try + { + using SqlConnection con = new SqlConnection(SqlConnectionString); + con.Open(); + using SqlCommand sqlCommand = con.CreateCommand(); + + string sql = @"select ID,Code,Name from tb_Sys_Hotels where IsDeleted=0;"; + sqlCommand.CommandText = sql; + SqlDataAdapter adapter = new SqlDataAdapter(sqlCommand); + DataSet dataSet = new DataSet(); + adapter.Fill(dataSet); + + DataTable dt = dataSet.Tables[0]; + List chaList = new List(); + if (dt != null && dt.Rows.Count > 0) + { + foreach (DataRow item in dt.Rows) + { + var id = item["ID"].ToString(); + var code = item["Code"].ToString(); + var Name = item["Name"].ToString(); + hotelinfo cha = new hotelinfo(); + cha.HotelID = id; + cha.HotelCode = code; + cha.HotelName = Name; + chaList.Add(cha); + } + } + returnInfo.isok = true; + returnInfo.response = chaList; + } + catch (Exception ex) + { + returnInfo.isok = false; + returnInfo.message = ex.Message; + } + return returnInfo; + } + + [OutputCache()] + public async Task GetHostList() + { + ReturnInfo returnInfo = new ReturnInfo(); + //return returnInfo; + try + { + using SqlConnection con = new SqlConnection(SqlConnectionString); + con.Open(); + using SqlCommand sqlCommand = con.CreateCommand(); + + string sql = @"select ID,HotelID,RoomTypeID,RoomNumber,HostNumber,MAC from tb_Hosts where IsDeleted=0;"; + sqlCommand.CommandText = sql; + SqlDataAdapter adapter = new SqlDataAdapter(sqlCommand); + DataSet dataSet = new DataSet(); + adapter.Fill(dataSet); + + DataTable dt = dataSet.Tables[0]; + List chaList = new List(); + if (dt != null && dt.Rows.Count > 0) + { + foreach (DataRow item in dt.Rows) + { + var id = item["ID"].ToString(); + var hid = item["HotelID"].ToString(); + var RoomTypeID = item["RoomTypeID"].ToString(); + var RoomNumber = item["RoomNumber"].ToString(); + var HostNumber = item["HostNumber"].ToString(); + var MAC = item["MAC"].ToString(); + hostinfo cha = new hostinfo(); + cha.ID = id; + cha.HotelID = hid; + cha.RoomTypeID = RoomTypeID; + cha.RoomNumber = RoomNumber; + cha.HostNumber = HostNumber; + cha.MAC = MAC; + chaList.Add(cha); + } + } + returnInfo.isok = true; + returnInfo.response = chaList; + } + catch (Exception ex) + { + returnInfo.isok = false; + returnInfo.message = ex.Message; + } + return returnInfo; + } + + [OutputCache()] + public async Task GetRoomType_Info() + { + ReturnInfo returnInfo = new ReturnInfo(); + try + { + using SqlConnection con = new SqlConnection(SqlConnectionString); + con.Open(); + using SqlCommand sqlCommand = con.CreateCommand(); + + string sql = @"select ID,HotelID,Name from tb_RoomType where IsDeleted=0;"; + sqlCommand.CommandText = sql; + SqlDataAdapter adapter = new SqlDataAdapter(sqlCommand); + DataSet dataSet = new DataSet(); + adapter.Fill(dataSet); + + DataTable dt = dataSet.Tables[0]; + List chaList = new List(); + if (dt != null && dt.Rows.Count > 0) + { + foreach (DataRow item in dt.Rows) + { + var id = item["ID"].ToString(); + var HotelID = item["HotelID"].ToString(); + var Name = item["Name"].ToString(); + roomtype_info cha = new roomtype_info(); + cha.HotelID = HotelID; + cha.ID = id; + cha.RoomTypeName = Name; + chaList.Add(cha); + } + } + returnInfo.isok = true; + returnInfo.response = chaList; + } + catch (Exception ex) + { + returnInfo.isok = false; + returnInfo.message = ex.Message; + } + return returnInfo; + } + + [OutputCache()] + [HttpPost()] + public async Task GetRoomType_ModalInfo([FromBody] List RoomTypeIDList) + { + ReturnInfo returnInfo = new ReturnInfo(); + try + { + var parameters = string.Join(',', RoomTypeIDList); + string sql = @$"select ID,RoomTypeID,ModalAddress,Type, Name from tb_RoomTypeModal WHERE RoomTypeID IN ({parameters});"; + //var sql = $"SELECT * FROM Products WHERE Id IN ({string.Join(",", parameters)})"; + //var qqq = await db.TbRoomTypeModals.Where(A => RoomTypeIDList.Contains(A.RoomTypeId)).ToListAsync(); + //var qqq = await db.TbRoomTypeModals.Where(A=>A.RoomTypeId==1).ToListAsync(); + using SqlConnection con = new SqlConnection(SqlConnectionString); + con.Open(); + using SqlCommand sqlCommand = con.CreateCommand(); + + sqlCommand.CommandText = sql; + SqlDataAdapter adapter = new SqlDataAdapter(sqlCommand); + DataSet dataSet = new DataSet(); + adapter.Fill(dataSet); + + DataTable dt = dataSet.Tables[0]; + List chaList = new List(); + if (dt != null && dt.Rows.Count > 0) + { + foreach (DataRow item in dt.Rows) + { + var id = item["ID"].ToString(); + var RoomTypeID = item["RoomTypeID"].ToString(); + var ModalAddress = item["ModalAddress"].ToString(); + var Type = item["Type"].ToString(); + var Name = item["Name"].ToString(); + roomtype_modalinfo cha = new roomtype_modalinfo(); + cha.ID = id; + cha.RoomTypeID = RoomTypeID; + cha.Name = Name; + cha.ModalAddress = ModalAddress; + cha.Type = Type; + chaList.Add(cha); + } + } + + //List chaList = new List(); + //foreach (var item in qqq) + //{ + + // roomtype_modalinfo cha = new roomtype_modalinfo(); + // cha.ID = item.Id.ToString(); + // cha.RoomTypeID = item.RoomTypeId.ToString(); + // cha.Name = item.Name; + // cha.ModalAddress = item.ModalAddress; + // cha.Type = item.Type.ToString(); + // chaList.Add(cha); + //} + returnInfo.isok = true; + returnInfo.response = chaList; + } + catch (Exception ex) + { + returnInfo.isok = false; + returnInfo.message = ex.Message; + } + return returnInfo; + } + //public static string SqlConnectionString = "Data Source=DESKTOP-DUNS5K7;Initial Catalog=CRICS;User ID=sa;Password=123456;Trust Server Certificate=True"; public static Logger logger = LogManager.GetCurrentClassLogger(); [HttpGet()] diff --git a/UseSQLQueryData/Properties/PublishProfiles/FolderProfile1.pubxml b/UseSQLQueryData/Properties/PublishProfiles/FolderProfile1.pubxml new file mode 100644 index 0000000..8036f94 --- /dev/null +++ b/UseSQLQueryData/Properties/PublishProfiles/FolderProfile1.pubxml @@ -0,0 +1,20 @@ + + + + + false + false + true + Release + Any CPU + FileSystem + bin\Release\net8.0\publish\ + FileSystem + <_TargetId>Folder + + net8.0 + win-x64 + 10f5f2cb-a414-43db-a99a-68081f2800fc + false + + \ No newline at end of file diff --git a/UseSQLQueryData/Properties/PublishProfiles/FolderProfile1.pubxml.user b/UseSQLQueryData/Properties/PublishProfiles/FolderProfile1.pubxml.user new file mode 100644 index 0000000..bcc2431 --- /dev/null +++ b/UseSQLQueryData/Properties/PublishProfiles/FolderProfile1.pubxml.user @@ -0,0 +1,9 @@ + + + + + <_PublishTargetUrl>E:\tian\chongxin\NewGit\Web_BLSKafka_Server_Prod\UseSQLQueryData\bin\Release\net8.0\publish\ + True|2026-01-31T06:49:29.1275223Z||;True|2026-01-31T14:13:11.7242950+08:00||;True|2026-01-31T14:10:05.1267470+08:00||;True|2026-01-31T13:37:30.6761345+08:00||;True|2026-01-31T11:30:39.2792110+08:00||;True|2026-01-31T11:28:44.6978619+08:00||;True|2026-01-31T11:27:35.8243470+08:00||; + + + \ No newline at end of file diff --git a/UseSQLQueryData/UseSQLQueryData.csproj.user b/UseSQLQueryData/UseSQLQueryData.csproj.user index bb95582..d880b2f 100644 --- a/UseSQLQueryData/UseSQLQueryData.csproj.user +++ b/UseSQLQueryData/UseSQLQueryData.csproj.user @@ -3,6 +3,6 @@ ApiControllerEmptyScaffolder root/Common/Api - E:\tian\BLS\BLWLogServer\UseSQLQueryData\Properties\PublishProfiles\FolderProfile.pubxml + E:\tian\chongxin\NewGit\Web_BLSKafka_Server_Prod\UseSQLQueryData\Properties\PublishProfiles\FolderProfile1.pubxml \ No newline at end of file