# YunDa.SOMS.Application 应用层文档 ## 目录 1. [模块概述](#模块概述) 2. [架构设计](#架构设计) 3. [核心基础设施](#核心基础设施) 4. [业务模块](#业务模块) 5. [技术栈](#技术栈) 6. [开发指南](#开发指南) 7. [API文档](#api文档) 8. [最佳实践](#最佳实践) ## 模块概述 YunDa.SOMS.Application 是云达智能变电站运维管理系统(SOMS)的应用服务层,负责实现系统的核心业务逻辑和对外API接口。该模块基于ABP框架构建,采用领域驱动设计(DDD)和分层架构模式,为变电站运维管理提供全面的应用服务。 ### 主要职责 - **业务逻辑实现**: 封装复杂的业务规则和流程 - **API接口提供**: 为前端和外部系统提供RESTful API - **数据传输对象**: 定义输入输出的数据传输对象(DTO) - **权限控制**: 实现基于角色的访问控制(RBAC) - **审计日志**: 记录系统操作和数据变更 - **缓存管理**: 提供Redis缓存支持 - **实时通信**: 支持WebSocket和SignalR实时数据推送 ### 设计理念 1. **分离关注点**: 将业务逻辑与数据访问、表示层分离 2. **依赖倒置**: 依赖抽象而非具体实现 3. **单一职责**: 每个服务类专注于特定的业务领域 4. **开闭原则**: 对扩展开放,对修改封闭 5. **可测试性**: 支持单元测试和集成测试 ## 架构设计 ### 整体架构 ``` YunDa.SOMS.Application/ ├── YunDa.SOMS.Application.Core/ # 核心基础设施 ├── YunDa.SOMS.Application/ # 主应用服务 ├── YunDa.SOMS.MongoDB.Application/ # MongoDB应用服务 └── YunDa.SOMS.ExternalInteraction.Application/ # 外部交互服务 ``` ### 模块依赖关系 ```mermaid graph TD A[YunDa.SOMS.Application] --> B[YunDa.SOMS.Application.Core] C[YunDa.SOMS.MongoDB.Application] --> B D[YunDa.SOMS.ExternalInteraction.Application] --> B B --> E[YunDa.SOMS.Core] B --> F[YunDa.SOMS.EntityFrameworkCore] B --> G[YunDa.SOMS.MongoDB] B --> H[YunDa.SOMS.Redis] B --> I[YunDa.SOMS.DataTransferObject] ``` ### 分层架构 1. **应用服务层 (Application Services)** - 协调领域对象执行业务用例 - 处理数据传输对象(DTO)转换 - 实现事务管理和权限控制 2. **领域服务层 (Domain Services)** - 实现复杂的业务逻辑 - 处理跨聚合根的业务操作 3. **基础设施层 (Infrastructure)** - 数据持久化(Entity Framework Core) - 缓存服务(Redis) - 文档存储(MongoDB) - 外部系统集成 ## 核心基础设施 ### SOMSAppServiceBase 所有应用服务的基类,提供通用功能: ```csharp [AbpAuthorize] [DisableAuditing] public abstract class SOMSAppServiceBase : ApplicationService { protected readonly ISessionAppService _sessionAppService; protected readonly IAppServiceConfiguration _appServiceConfiguration; // 获取当前登录用户 protected virtual LoginUserOutput GetCurrentUser() // 图片处理功能 protected virtual byte[] ResizeImage(byte[] imageBytes, int width, int height) } ``` **主要功能:** - 用户会话管理 - 权限验证 - 本地化支持 - 图片处理工具 - 配置访问 ### IAppServiceBase 标准CRUD操作的通用接口: ```csharp public interface IAppServiceBase { RequestPageResult FindDatas(PageSearchCondition searchCondition); Task> CreateOrUpdateAsync(TEditInput input); Task DeleteByIdsAsync(List ids); Task DeleteByIdAsync(TDelPrimaryKey id); } ``` **设计优势:** - 统一的CRUD接口规范 - 泛型支持提高代码复用 - 标准化的返回结果格式 - 支持分页查询 ### 配置管理 #### IAppServiceConfiguration 系统配置接口,管理应用级配置参数: ```csharp public interface IAppServiceConfiguration { string SysAttachmentFolder { get; set; } // 系统附件文件夹 int MasterStationType { get; set; } // 主站类型 long MaxDataCount { get; set; } // 遥测分析最大查询项 string MasterStationBaseUrl { get; set; } // 主站通信基础URL string IsmsGateWayIp { get; set; } // ISMS网关IP string FtpIp { get; set; } // FTP服务器IP int UploadWaitSeconds { get; set; } // 上传等待时间 bool IsCpmpressImageForMasterStation { get; set; } // 是否压缩图片 } ``` ### 会话管理 #### SessionAppService 管理用户会话和认证信息: ```csharp [DisableAuditing] public class SessionAppService : ISessionAppService { private readonly IHttpContextAccessor _contextAccessor; public CurrentLoginInformationsOutput GetCurrentLoginInformations() { // 从HTTP上下文获取用户信息 // 解析JWT Token中的用户数据 // 返回当前登录用户信息和应用信息 if (_contextAccessor.HttpContext?.User?.Identity?.IsAuthenticated == true) { string userDataJsonStr = _contextAccessor.HttpContext.User.Claims .Where(claim => claim.Type == ClaimTypes.UserData) .FirstOrDefault().Value; output.User = JsonConvert.DeserializeObject(userDataJsonStr); } } } ``` ### 审计日志 #### SOMSAuditingStore 自定义审计日志存储实现: ```csharp public class SOMSAuditingStore : IAuditingStore { private readonly IMongoDbRepository _sysAuditLogRepository; private List _serviceNames = new List { "综自信息查询", "变电所扩展服务" }; public async Task SaveAsync(AuditInfo auditInfo) { if (auditInfo == null) return; if (_serviceNames.Contains(auditInfo.ServiceName)) { SysAuditLog sysAuditLog = CreateFromAuditInfo(auditInfo); _sysAuditLogRepository.CollectionName = "SysAuditLog_" + DateTime.Now.ToString("yyyyMM"); _sysAuditLogRepository.InsertOne(sysAuditLog); } } } ``` **审计功能:** - 自动记录API调用 - 按服务名称过滤 - MongoDB分表存储(按月份) - 异常处理和日志记录 #### SOMSAuditingHelper 自定义审计日志助手: ```csharp public class SOMSAuditingHelper : IAuditingHelper { public AuditInfo CreateAuditInfo(Type type, MethodInfo method, object[] arguments) { // 获取类型和方法的Description特性 var typeDescription = type.GetCustomAttribute(); var methodDescription = method.GetCustomAttribute(); return new AuditInfo { TenantId = AbpSession.TenantId, UserId = AbpSession.UserId, ServiceName = typeDescription?.Description ?? type.Name, MethodName = methodDescription?.Description ?? method.Name, Parameters = ConvertArgumentsToJson(arguments), ExecutionTime = Clock.Now }; } } ``` ### 实时通信服务 #### IRealTimeCommunicationService 统一的WebSocket和SignalR通信接口: ```csharp public interface IRealTimeCommunicationService { // 通知相关 Task SendNotificationToUserAsync(string userId, string message, string type = "info", string title = null, Guid? transformerSubstationId = null); Task BroadcastNotificationAsync(string message, string type = "info", string title = null, Guid? transformerSubstationId = null); // 数据更新 Task SendDataUpdateAsync(string dataType, object data, string[] targetUsers = null, Guid? transformerSubstationId = null); Task SendAlarmAsync(object alarmData, string[] targetUsers = null, Guid? transformerSubstationId = null); Task SendDeviceUpdateAsync(string deviceId, string status, object data = null, string[] targetUsers = null, Guid? transformerSubstationId = null); // 系统事件 Task SendSystemEventAsync(string eventType, object eventData, string[] targetUsers = null, Guid? transformerSubstationId = null); // 用户管理 Task IsUserOnlineAsync(string userId); Task GetOnlineUserCountAsync(); Task GetOnlineUsersAsync(); // 自定义消息 Task SendCustomMessageAsync(string messageType, object data, string[] targetUsers = null, bool useSignalR = true); } ``` #### RealTimeCommunicationService 实时通信服务实现: ```csharp public class RealTimeCommunicationService : IRealTimeCommunicationService, ITransientDependency { private readonly ISignalRService _signalRService; private readonly IWebSocketService _webSocketService; private readonly ICommunicationConfigurationCacheService _configurationCacheService; public virtual async Task SendDataUpdateAsync(string dataType, object data, string[] targetUsers = null, Guid? transformerSubstationId = null) { // 从配置缓存服务获取WebSocket优先级设置 var useWebSocketPriority = await _configurationCacheService.GetWebSocketPriorityAsync(transformerSubstationId); var enableAutoFailover = await _configurationCacheService.GetEnableAutoFailoverAsync(transformerSubstationId); var retryCount = await _configurationCacheService.GetFailoverRetryCountAsync(transformerSubstationId); // 根据配置选择通信方式并实现故障转移 if (useWebSocketPriority) { // 优先使用WebSocket,失败时转移到SignalR } else { // 优先使用SignalR,失败时转移到WebSocket } } } ``` **特性:** - 支持WebSocket和SignalR双通道 - 配置驱动的通信策略 - 自动故障转移机制 - 消息压缩和持久化 - 变电站级别的配置隔离 ### 通信配置缓存服务 #### ICommunicationConfigurationCacheService 通信配置缓存服务接口: ```csharp public interface ICommunicationConfigurationCacheService { // WebSocket配置 Task GetWebSocketPriorityAsync(Guid? transformerSubstationId = null); Task GetWebSocketTimeoutSecondsAsync(Guid? transformerSubstationId = null); // SignalR配置 Task GetSignalRTimeoutSecondsAsync(Guid? transformerSubstationId = null); // 故障转移配置 Task GetEnableAutoFailoverAsync(Guid? transformerSubstationId = null); Task GetFailoverRetryCountAsync(Guid? transformerSubstationId = null); // 消息配置 Task GetEnableMessageCompressionAsync(Guid? transformerSubstationId = null); Task GetEnableMessagePersistenceAsync(Guid? transformerSubstationId = null); Task GetMaxMessageQueueLengthAsync(Guid? transformerSubstationId = null); // 缓存管理 Task ClearCacheAsync(Guid? transformerSubstationId = null); Task ClearAllCacheAsync(); Task WarmupCacheAsync(); } ``` #### CommunicationConfigurationCacheService 通信配置缓存服务实现: ```csharp public class CommunicationConfigurationCacheService : ICommunicationConfigurationCacheService, ITransientDependency { private readonly IRepository _communicationConfigurationRepository; private readonly IMemoryCache _memoryCache; private const string CACHE_KEY_PREFIX = "CommConfig_"; private const int CACHE_EXPIRATION_MINUTES = 30; // 默认配置值 private const bool DEFAULT_WEBSOCKET_PRIORITY = false; private const int DEFAULT_WEBSOCKET_TIMEOUT = 30; private const int DEFAULT_SIGNALR_TIMEOUT = 30; private const bool DEFAULT_ENABLE_AUTO_FAILOVER = true; private const int DEFAULT_FAILOVER_RETRY_COUNT = 3; public async Task GetWebSocketPriorityAsync(Guid? transformerSubstationId = null) { var config = await GetEffectiveConfigurationAsync(transformerSubstationId); return config?.WebSocketPriority ?? DEFAULT_WEBSOCKET_PRIORITY; } private async Task GetEffectiveConfigurationAsync(Guid? transformerSubstationId) { var cacheKey = GetCacheKey(transformerSubstationId); if (_memoryCache.TryGetValue(cacheKey, out CommunicationConfiguration cachedConfig)) { return cachedConfig; } // 首先查找指定变电站的配置 var config = _communicationConfigurationRepository.GetAll() .Where(x => x.IsActive && x.TransformerSubstationId == transformerSubstationId) .OrderBy(x => x.Priority) .FirstOrDefault(); // 如果没有找到且不是全局查询,则查找全局配置 if (config == null && transformerSubstationId.HasValue) { config = _communicationConfigurationRepository.GetAll() .Where(x => x.IsActive && x.TransformerSubstationId == null) .OrderBy(x => x.Priority) .FirstOrDefault(); } // 缓存配置 var cacheOptions = new MemoryCacheEntryOptions { AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(CACHE_EXPIRATION_MINUTES), SlidingExpiration = TimeSpan.FromMinutes(CACHE_EXPIRATION_MINUTES / 2) }; _memoryCache.Set(cacheKey, config, cacheOptions); return config; } } ``` **特性:** - 内存缓存提高性能 - 支持变电站级别配置 - 配置继承机制(变电站配置 -> 全局配置 -> 默认值) - 缓存预热和清理功能 - 滑动过期策略 ### 扩展应用服务 #### InspectionTaskExtensionAppService 巡检任务扩展服务,提供对外通信接口: ```csharp [AbpAllowAnonymous, Description("对外通信-巡检扩展管理服务")] public class InspectionTaskExtensionAppService : AbpServiceBase, IInspectionTaskExtensionAppService { private readonly IRepository _inspectionCardRepository; private readonly IMongoDbRepository _inspectionResultRepository; private readonly IMongoDbRepository _inspectionItemResultRepository; private readonly IMongoDbRepository _robotTaskResultRepository; // 文件上传处理 private ByteArrayContent GetFileByteArrayContent(byte[] fileBytes, out int fileByteCount) { if (fileBytes == null) { fileByteCount = 0; return null; } if (_appServiceConfiguration.IsCpmpressImageForMasterStation) { var imageBytes = ImageChangeSize.CutImageSize(fileBytes); fileByteCount = imageBytes.Length; return new ByteArrayContent(imageBytes); } else { fileByteCount = fileBytes.Length; return new ByteArrayContent(fileBytes); } } // HTTP请求处理 public async Task SendHttpRequestAsync(string url, object input) { return await Task.Run(() => { try { HttpHelper.HttpPostRequest(url, input); var inputjson = JsonConvert.SerializeObject(input); Log4Helper.Info(this.GetType(), $"请求地址:{url},请求内容:{inputjson}"); return new RequestEasyResult { Flag = true }; } catch (Exception ex) { Log4Helper.Error(this.GetType(), "巡检任务扩展服务", ex); return new RequestEasyResult { Flag = false, Message = ex.Message }; } }); } } ``` **功能:** - 巡检结果数据处理 - 文件上传和压缩 - HTTP请求封装 - 机器人任务结果管理 - 对外接口通信 ## 业务模块 ### 数据监控 (DataMonitoring) 负责变电站数据监控相关的业务逻辑,是SOMS系统的核心功能模块: #### 遥测配置管理 (TelemeteringConfiguration) **服务类**: `TelemeteringConfigurationAppService` **接口**: `ITelemeteringConfigurationAppService` **核心功能:** - 遥测点配置管理(模拟量数据点) - 数据采集参数设置(采样频率、系数、单位) - 环境温度监控和缓存 - 通信数据结构管理 **主要方法:** ```csharp [HttpPost, Audited, Description("遥测数据增加或修改")] public async Task> CreateOrUpdateAsync(EditTelemeteringConfigurationInput input) [HttpPost, Description("查询遥测数据")] public RequestPageResult FindDatas(PageSearchCondition searchCondition) [HttpPost, AbpAllowAnonymous] public RequestResult FindTelesignalisationConfigurationDataStruct(TelemeteringConfigurationSearchConditionInput input) [HttpGet, AbpAllowAnonymous] public async Task> GetEnvironmentTempValue(Guid? transubstationId) ``` **数据模型特点:** - 支持虚拟装置点位配置 - 多级地址映射(信息地址、装置地址、调度地址) - 系数和小数位数配置 - 数据来源分类(综自、保护装置等) - 主副设备关联支持 #### 遥信配置管理 (TelesignalisationConfiguration) **服务类**: `TelesignalisationConfigurationAppService` **接口**: `ITelesignalisationConfigurationAppService` **核心功能:** - 遥信点配置管理(开关量数据点) - 开关状态监控和变位检测 - 通信数据结构管理 - 自检配置关联 **主要方法:** ```csharp [HttpPost, Audited, Description("遥信数据增加或修改")] public async Task> CreateOrUpdateAsync(EditTelesignalisationConfigurationInput input) [HttpPost, Description("查询遥信数据")] public RequestPageResult FindDatas(PageSearchCondition searchCondition) [HttpPost, AbpAllowAnonymous] public RequestResult FindTelesignalisationConfigurationDataStruct(TelesignalisationConfigurationSearchConditionInput input) [HttpGet, AbpAllowAnonymous] public RequestResult> FindTelesignalisationConfigurationForSelect(SelectTelesignalisationSearchConditionInput searchCondition) ``` **特殊功能:** - 支持单双点类型配置 - 正常状态和异常状态定义 - 与自检配置的关联 - 通信数据结构自动计算 #### 遥控配置管理 (TelecommandConfiguration) **服务类**: `TelecommandConfigurationAppService` **接口**: `ITelecommandConfigurationAppService` **核心功能:** - 遥控指令配置管理 - 操作权限和安全控制 - 执行计划和模板管理 - 相关遥信关联 **数据模型:** ```csharp public class TelecommandConfiguration : SOMSAuditedEntity, ISOMSPassivable { public string Name { get; set; } // 遥控名称 public bool IsVirtualDevice { get; set; } // 是否虚拟装置 public int InfoAddress { get; set; } // 信息地址 public int DeviceAddress { get; set; } // 装置地址 public int DispatcherAddress { get; set; } // 调度地址 public RemoteTypeEnum RemoteType { get; set; } // 单双点类型 public Guid? RelatedTelesignalisationId { get; set; } // 相关遥信 public Guid? PrimaryEquipmentInfoId { get; set; } // 主设备 public Guid? SecondaryEquipmentInfoId { get; set; } // 副设备 public DataSourceCategoryEnum? DataSourceCategory { get; set; } // 数据来源 } ``` **安全特性:** - 双设备关联支持(主副设备) - 相关遥信状态验证 - 操作权限控制 - 执行结果反馈 #### 报警策略管理 ##### 遥测报警策略 (TelemeteringAlarmStrategy) **核心功能:** - 基于阈值的模拟量报警 - 多级报警等级设置 - 报警抑制和恢复逻辑 **数据模型:** ```csharp public class TelemeteringAlarmStrategy : SOMSAuditedEntity, ISOMSPassivable { public int SeqNo { get; set; } // 顺序 public float MinValue { get; set; } // 最小值 public float MaxValue { get; set; } // 最大值 public Guid? DMAlarmCategoryId { get; set; } // 报警分类 public Guid? TelemeteringConfigurationId { get; set; } // 关联遥测 public Guid? EquipmentInfoId { get; set; } // 关联设备 public Guid? TransformerSubstationId { get; set; } // 所属变电站 } ``` ##### 遥测报警模板 (TelemeteringAlarmTemplate) **核心功能:** - 报警策略模板化管理 - 批量应用报警配置 - 标准化报警参数 **应用场景:** - 同类型设备批量配置 - 报警参数标准化 - 快速部署新设备 #### 联动策略管理 ##### 联动策略 (LinkageStrategy) **核心功能:** - 基于JavaScript规则引擎的联动逻辑 - 多条件组合判断 - 时间间隔和重复控制 **数据模型:** ```csharp public class LinkageStrategy : SOMSAuditedEntity, ISOMSPassivable { public string Name { get; set; } // 联动名称 public string Rule { get; set; } // JavaScript规则 public string ConditionIds { get; set; } // 条件ID列表 public int TimeOfWithRelationship { get; set; } // 条件关系时间间隔 public int RepeatLinkageInterval { get; set; } // 重复联动间隔 public int ForceLinkageTimes { get; set; } // 强制联动次数 public int ForceLinkageSeconds { get; set; } // 强制联动时间 public Guid TransformerSubstationId { get; set; } // 关联变电站 } ``` **规则示例:** ```javascript // 简单逻辑运算 "((30 + 4) * 2+2)||true" // 条件判断 "if(0==1){return 1+1;}else{return 2+1;}" // 复杂条件组合 "(condition1 && condition2) || (condition3 && !condition4)" ``` ##### 联动条件 (LinkageCondition) **核心功能:** - 多类型条件定义(遥测、遥信、设备状态) - 条件参数配置 - 条件组合逻辑 **数据模型:** ```csharp public class LinkageCondition : SOMSAuditedEntity, ISOMSPassivable { public ConditionTypeEnum ConditionType { get; set; } // 条件类型 public Guid? EquipmentTypeId { get; set; } // 设备类型 public Guid? EquipmentInfoId { get; set; } // 关联设备 public Guid? TelemeteringConfigurationId { get; set; } // 遥测关联 public Guid? TelesignalisationConfigurationId { get; set; } // 遥信关联 public float? MinValue { get; set; } // 最小值 public float? MaxValue { get; set; } // 最大值 public bool? BoolValue { get; set; } // 布尔值 public Guid? TransformerSubstationId { get; set; } // 所属变电站 } ``` **条件类型:** - **遥测条件**: 基于模拟量阈值判断 - **遥信条件**: 基于开关量状态判断 - **设备条件**: 基于设备运行状态判断 - **时间条件**: 基于时间窗口判断 ##### 联动执行活动 (LinkageExecuteActivity) **核心功能:** - 联动动作定义和执行 - 多种执行类型支持 - 执行结果反馈 **执行类型:** - **遥控执行**: 发送遥控指令 - **摄像头控制**: 调整摄像头预置位 - **报警发送**: 发送报警通知 - **数据记录**: 记录事件日志 **执行流程:** ```csharp public async Task ExecuteLinkageDataAsync(LinkageStrategyModel linkageStrategy, string resultStr, string code) { // 1. 解析联动策略 // 2. 获取执行活动列表 // 3. 按类型分组执行 // 4. 记录执行结果 // 5. 发送执行反馈 } ``` #### 自检配置管理 (SelfCheckingConfiguration) **核心功能:** - 设备自检策略配置 - 通信状态监控 - 超时判断和处理 **数据模型:** ```csharp public class SelfCheckingConfiguration : SOMSAuditedEntity, ISOMSPassivable { public string Name { get; set; } // 配置名称 public DataTypeEnum DataType { get; set; } // 数据类型(遥测/遥信/遥控) public int TimeOfJudgment { get; set; } // 判定时间(秒) public JudgmentModeEnum JudgmentMode { get; set; } // 判定模式 public Guid? EquipmentInfoId { get; set; } // 关联设备 public Guid? TransformerSubstationId { get; set; } // 所属变电站 } ``` **判定模式:** - **超时判定**: 数据超时未更新 - **变化判定**: 数据值异常变化 - **范围判定**: 数据值超出正常范围 - **通信判定**: 通信链路状态检查 #### 模板管理系统 ##### 遥测模板 (TelemeteringTemplate) - 遥测点标准化配置 - 批量创建遥测点 - 参数模板化管理 ##### 遥信模板 (TelesignalisationTemplate) - 遥信点标准化配置 - 批量创建遥信点 - 状态定义模板化 ##### 遥控模板 (TelecommandTemplate) - 遥控指令标准化配置 - 批量创建遥控点 - 安全参数模板化 #### 实时数据处理 **数据流程:** ``` 设备数据 → IEC104协议解析 → ActionBlock队列处理 → 数据验证 → Redis缓存 → MongoDB存储 ``` **缓存策略:** - **TelemeteringModelListRedis**: 遥测数据实时库 - **TelesignalisationModelListRedis**: 遥信数据实时库 - **AlarmListRedis**: 告警数据缓存 - **EnvironmentTempValueRedis**: 环境温度数据缓存 **存储策略:** - **周期保存**: 按固定时间间隔保存数据 - **变化保存**: 数据变化时触发保存 - **混合保存**: 结合周期和变化保存策略 - **分表存储**: 按时间分表提高查询性能 #### 报警分析引擎 **报警类型:** - **遥测报警**: 基于阈值的模拟量报警 - **遥信报警**: 开关量状态变化报警 - **设备报警**: 设备自检和状态报警 - **二次回路报警**: 二次回路逻辑分析报警 **报警处理流程:** 1. 数据采集和预处理 2. 报警策略匹配 3. 报警条件判断 4. 报警生成和分级 5. 报警通知和记录 6. 联动策略触发 #### 能源管理 (EnergyManagement) **核心功能:** - 电能数据采集和分析 - 能耗统计和报表 - 能效分析和优化建议 #### 环境数据监控 (EnvironmentLiveData) **核心功能:** - 环境参数实时监控 - 温湿度数据采集 - 环境报警和控制 #### 智能设备巡检 (IntelligentDeviceInspector) **核心功能:** - 设备状态智能分析 - 异常模式识别 - 预测性维护建议 ### 综合信息管理 (GeneralInformation) 管理变电站基础信息和设备档案,是SOMS系统的基础数据管理模块: #### 设备信息管理 (EquipmentInfo) **服务类**: `EquipmentInfoAppService`, `EquipmentInfoExAppService` **接口**: `IEquipmentInfoAppService`, `IEquipmentInfoExAppService` **核心功能:** - 设备档案全生命周期管理 - 设备状态实时监控 - 安全状态自动更新 - 模板同步和批量操作 - 设备资产信息管理 **数据模型:** ```csharp public class EquipmentInfo : SOMSAuditedEntity, ISOMSPassivable { public string Name { get; set; } // 设备名称 public string Code { get; set; } // 设备编码 public Guid? EquipmentTypeId { get; set; } // 设备类型 public Guid? BelongEquipmentInfoId { get; set; } // 所属设备 public Guid? ManufacturerInfoId { get; set; } // 生产厂商 public Guid? TransformerSubstationId { get; set; } // 所属变电站 public bool IsRemoteControl { get; set; } // 是否可远程控制 public SafetyStateTypeEnum? SafetyStateType { get; set; } // 安防状态 public SafetyStateTypeEnum? SafetyPlanStateType { get; set; } // 计划安防状态 public DateTime? SafetyPlanTime { get; set; } // 安防计划时间 public string Remark { get; set; } // 备注 } public enum SafetyStateTypeEnum { [Description("不具备此功能")] None = 0, [Description("布防")] Arming = 1, [Description("撤防")] Disarming = 2, } ``` **主要方法:** ```csharp [HttpPost, Audited, Description("设备信息增加或修改")] public async Task> CreateOrUpdateAsync(EditEquipmentInfoInput input) [HttpGet, AbpAllowAnonymous, ShowApi] public RequestEasyResult FreshSafetyState() [HttpPost, Audited, Description("根据设备类型同步更新遥信、遥测、模板")] public RequestEasyResult SyncTeleTemplate() // 扩展服务方法 public RequestResult GetEquipmentInfoAsset(Guid equipementId) ``` **安全状态管理:** - **自动状态更新**: 根据计划时间自动切换安防状态 - **状态类型**: 布防、撤防、不具备功能 - **计划调度**: 支持预设安防状态切换时间 - **状态监控**: 实时监控设备安防状态变化 **模板同步功能:** - 根据设备类型自动创建遥测、遥信、遥控配置 - 批量应用设备模板参数 - 模板参数继承和覆盖机制 - 同步状态跟踪和异常处理 **设备资产管理:** - 设备基础信息档案 - 保护装置关联信息 - ISMS系统设备映射 - 设备核心参数管理 #### 变电站管理 (TransformerSubstation) **服务类**: `TransformerSubstationAppService`, `TransformerSubstationExAppService` **接口**: `ITransformerSubstationAppService` **核心功能:** - 变电站基础信息管理 - 地理位置和坐标管理 - 通信参数配置 - 主站服务地址管理 - 供电线路关联 **数据模型:** ```csharp public class TransformerSubstation : SOMSAuditedEntity, ISOMSPassivable { public int SeqNo { get; set; } // 序号 public string SubstationName { get; set; } // 变电站名称 public string CommMgrIP { get; set; } // 通信管理机IP public string MasterStationAddress { get; set; } // 主站服务地址 public double? Longitude { get; set; } // 经度 public double? Latitude { get; set; } // 纬度 public Guid? PowerSupplyLineId { get; set; } // 供电线路 public string Remark { get; set; } // 备注 // 导航属性 public virtual PowerSupplyLine PowerSupplyLine { get; set; } public virtual IEnumerable VideoDevs { get; set; } public virtual IEnumerable EquipmentInfos { get; set; } } ``` **地理信息管理:** - GPS坐标定位 - 地理位置可视化 - 区域范围管理 - 地图集成支持 **通信配置:** - 通信管理机IP配置 - 主站服务地址管理 - 通信协议参数设置 - 网络连接状态监控 **数据同步功能:** - 与ISMS系统数据同步 - 变电站信息自动导入 - 数据一致性检查 - 同步状态跟踪 #### 设备类型管理 (EquipmentType) **服务类**: `EquipmentTypeAppService` **接口**: `IEquipmentTypeAppService` **核心功能:** - 设备分类体系管理 - 层级结构维护 - 模板关联管理 - 类型参数配置 **数据模型:** ```csharp public class EquipmentType : SOMSAuditedEntity, ISOMSPassivable { public string Name { get; set; } // 类型名称 public string Code { get; set; } // 类型编码 public Guid? EquipmentTypeId { get; set; } // 父节点ID // 导航属性 public virtual IEnumerable EquipmentInfos { get; set; } public virtual IEnumerable TelemeteringTemplates { get; set; } public virtual IEnumerable TelesignalisationTemplates { get; set; } public virtual IEnumerable TelecommandTemplates { get; set; } } ``` **层级管理:** - 树形结构组织 - 父子关系维护 - 层级权限控制 - 递归查询支持 **模板关联:** - 遥测模板关联 - 遥信模板关联 - 遥控模板关联 - 模板继承机制 #### 制造商信息管理 (ManufacturerInfo) **服务类**: `ManufacturerInfoAppService` **接口**: `IManufacturerInfoAppService` **核心功能:** - 厂商档案管理 - 联系方式维护 - 产品信息管理 - 厂商编码规范 **数据模型:** ```csharp public class ManufacturerInfo : SOMSFullAuditedEntity, ISOMSPassivable { public string ManufacturerName { get; set; } // 厂商名称 public string ManufacturerCode { get; set; } // 厂商编码 public string PhoneNumber { get; set; } // 厂商电话 public string EmailAddress { get; set; } // 邮件地址 public string ManufacturerAddress { get; set; } // 厂商地址 public string Remark { get; set; } // 备注 } ``` **厂商管理:** - 厂商基础信息维护 - 联系方式管理 - 产品线管理 - 服务支持信息 #### 保护装置管理 (ProtectionDevice) **服务类**: `ProtectionDeviceAppService` **接口**: `IProtectionDeviceAppService` **核心功能:** - 保护装置档案管理 - 装置参数配置 - ISMS系统集成 - 保护定值管理 **数据模型:** ```csharp public class ProtectionDeviceInfo : SOMSAuditedEntity, ISOMSPassivable { public int SeqNo { get; set; } // 顺序号 public string Name { get; set; } // 设备名称 public Guid EquipmentInfoId { get; set; } // 关联设备 public string ISMS_DeviceId { get; set; } // ISMS设备ID public Guid? ProtectionDeviceTypeId { get; set; } // 保护装置类型 public string InstallationArea { get; set; } // 安装区域 public string PostionDescription { get; set; } // 位置描述 public string RunNumber { get; set; } // 运行编号 // 导航属性 public virtual EquipmentInfo EquipmentInfo { get; set; } public virtual ProtectionDeviceType ProtectionDeviceType { get; set; } } ``` **ISMS集成:** - 与ISMS保护装置数据同步 - 装置状态实时监控 - 保护动作记录 - 定值管理集成 #### 保护定值管理 (ProtectionSetting) **核心功能:** - 保护定值配置管理 - 定值版本控制 - 定值下发和校验 - 定值变更记录 **数据模型:** ```csharp public class ProtectionSetting : SOMSAuditedEntity { public Guid EquipmentInfoId { get; set; } // 对应设备 public Guid ProtectionDeviceInfoId { get; set; } // 对应保护装置 public string ISMS_DeviceId { get; set; } // ISMS设备ID public string ISMS_DeviceDZId { get; set; } // 定值ID // 导航属性 public virtual EquipmentInfo EquipmentInfo { get; set; } public virtual ProtectionDeviceInfo ProtectionDeviceInfo { get; set; } } ``` #### 供电线路管理 (PowerSupplyLine) **核心功能:** - 供电线路档案管理 - 线路参数配置 - 线路拓扑关系 - 线路状态监控 #### 二次回路信息 (SecondaryCircuitInfo) **核心功能:** - 二次回路图纸管理 - 回路连接关系 - 回路状态分析 - 回路故障诊断 #### 设备位置管理 (EquipmentLocation) **核心功能:** - 设备物理位置管理 - 位置坐标定位 - 位置可视化展示 - 位置变更记录 #### 设备视点管理 (EquipmentViewPoint) **核心功能:** - 设备监控视点配置 - 摄像头关联管理 - 视点切换控制 - 视点状态监控 #### 主站信息管理 (MasterStation) **核心功能:** - 主站系统信息管理 - 主站通信配置 - 主站状态监控 - 主站服务管理 #### 数据集成特性 **ISMS系统集成:** - 保护装置数据同步 - 设备状态实时更新 - 保护动作记录同步 - 定值管理集成 **数据一致性:** - 跨模块数据关联 - 数据完整性约束 - 数据变更追踪 - 数据同步机制 **批量操作支持:** - 批量导入设备信息 - 批量更新设备参数 - 批量应用模板配置 - 批量状态变更 ### 视频监控 (VideoSurveillance) 提供视频监控和智能巡检功能,是SOMS系统的重要组成部分: #### 视频设备管理 (VideoDev) **服务类**: `VideoDevAppService`, `VideoElectronicFenceAppService` **接口**: `IVideoDevAppService` **核心功能:** - 摄像头设备配置管理 - 电子围栏监控和报警 - 设备权限控制 - 设备状态监控 - 配置信息同步 **数据模型:** ```csharp public class VideoDev : SOMSAuditedEntity, ISOMSPassivable { public int? SeqNo { get; set; } // 序号 public string Name { get; set; } // 设备名称 public string Ip { get; set; } // 设备IP地址 public int? Port { get; set; } // 端口号 public string DevUserName { get; set; } // 设备用户名 public string DevPassword { get; set; } // 设备密码 public int? ChannelNo { get; set; } // 通道号 public VideoDevTypeEnum VideoDevType { get; set; } // 设备类型 public string InstallationArea { get; set; } // 安装区域 public string PostionDescription { get; set; } // 位置描述 public Guid? VideoDevId { get; set; } // 父设备ID(NVR) public Guid? LinkVideoDevId { get; set; } // 关联设备ID public Guid? MasterStationId { get; set; } // 主站ID public CtrAuPosEnum? CtrAuPos { get; set; } // 控制权位置 public Guid? TransformerSubstationId { get; set; } // 所属变电站 // 导航属性 public virtual VideoDev Parent { get; set; } // NVR信息 public virtual VideoDev LinkVideoDev { get; set; } // 关联相机 public virtual TransformerSubstation TransformerSubstation { get; set; } public virtual IEnumerable PresetPoints { get; set; } } ``` **设备类型:** - **NVR**: 网络视频录像机 - **DVR**: 数字视频录像机 - **Camera**: 网络摄像机 - **PTZ**: 云台摄像机 **电子围栏功能:** ```csharp [HttpPost, ShowApi, AllowAnonymous] public RequestEasyResult UploadCfg([FromBody] Dictionary> request) [HttpGet, ShowApi, AllowAnonymous] public async Task UploadAlarmMsg([FromQuery] string id, [FromQuery]string? content) ``` **特殊功能:** - 配置信息批量上传 - 报警信息实时上传 - Redis缓存报警数据 - 自动关联预置点 #### 预置点管理 (PresetPoint) **服务类**: `PresetPointAppService` **接口**: `IPresetPointAppService` **核心功能:** - 摄像头预置位配置 - 巡检路径规划 - 设备视点关联 - 自动巡航控制 **数据模型:** ```csharp public class PresetPoint : SOMSAuditedEntity, ISOMSPassivable { public int Number { get; set; } // 预置点号 public string Name { get; set; } // 预置点名称 public string Remark { get; set; } // 备注 public Guid? VideoDevId { get; set; } // 所属摄像头 public Guid? EquipmentViewPointId { get; set; } // 设备视口 public Guid? EquipmentTypeId { get; set; } // 设备类型 public Guid? EquipmentInfoId { get; set; } // 关联设备 // 导航属性 public virtual VideoDev VideoDev { get; set; } public virtual EquipmentViewPoint EquipmentViewPoint { get; set; } public virtual EquipmentType EquipmentType { get; set; } public virtual EquipmentInfo EquipmentInfo { get; set; } public virtual IEnumerable InspectionItems { get; set; } public virtual IEnumerable MeasureTemperaturePoints { get; set; } } ``` **预置点功能:** - 预置位精确定位 - 设备关联映射 - 巡检路径优化 - 视点状态监控 #### 巡检管理系统 ##### 巡检卡片管理 (InspectionCard) **服务类**: `InspectionCardAppService` **接口**: `IInspectionCardAppService` **核心功能:** - 巡检任务单管理 - 巡检流程配置 - 主站任务下发 - 临时巡检支持 **数据模型:** ```csharp public class InspectionCard : SOMSAuditedEntity, ISOMSPassivable { public string Code { get; set; } // 巡检记录单编号 public string CardName { get; set; } // 任务单名称 public string Remark { get; set; } // 备注 public bool IsIssue { get; set; } // 是否主站下发 public bool IsTemporary { get; set; } // 是否临时任务 public bool OpenWiper { get; set; } // 是否打开雨刷 public int ResidenceTime { get; set; } // 停留时间 public StationLevelEnum? CenterType { get; set; } // 发送者站级别 public Guid? MasterStationId { get; set; } // 主站ID public Guid? TransformerSubstationId { get; set; } // 所属变电站 // 导航属性 public virtual MasterStation MasterStation { get; set; } public virtual TransformerSubstation TransformerSubstation { get; set; } public virtual IEnumerable InspectionItems { get; set; } public virtual IEnumerable InspectionPlanTasks { get; set; } } ``` **巡检任务特性:** - 支持主站下发任务 - 临时巡检任务支持 - 雨刷控制功能 - 停留时间配置 ##### 巡检项目管理 (InspectionItem) **服务类**: `InspectionItemAppService` **接口**: `IInspectionItemAppService` **核心功能:** - 巡检点位配置 - 巡检动作定义 - 设备关联管理 - 执行流程控制 **数据模型:** ```csharp public class InspectionItem : SOMSAuditedEntity, ISOMSPassivable { public int SeqNo { get; set; } // 序号 public string Name { get; set; } // 巡检项名称 public ProcessActionEnum ProcessAction { get; set; } // 处理动作 public int ResidenceTime { get; set; } // 停留时间 public int PictureNum { get; set; } // 拍照数量 public Guid? InspectionCardId { get; set; } // 所属任务单 public Guid? VideoDevId { get; set; } // 所属摄像头 public Guid? PresetPointId { get; set; } // 所属预置点 // 导航属性 public virtual InspectionCard InspectionCard { get; set; } public virtual VideoDev VideoDev { get; set; } public virtual PresetPoint PresetPoint { get; set; } } public enum ProcessActionEnum { [Description("无活动")] None = 0, [Description("仅拍照")] Photograph = 1, [Description("测温及拍照")] MeasureTemperature = 2, } ``` **巡检动作类型:** - **无活动**: 仅移动到预置点 - **仅拍照**: 拍照记录 - **测温及拍照**: 红外测温和拍照 ##### 巡检计划任务 (InspectionPlanTask) **服务类**: `InspectionPlanTaskAppService` **接口**: `IInspectionPlanTaskAppService` **核心功能:** - 巡检计划调度 - 定时任务管理 - 周期性巡检 - 执行时间控制 **数据模型:** ```csharp public class InspectionPlanTask : SOMSAuditedEntity, ISOMSPassivable { public int SeqNo { get; set; } // 序号 public string PlanTaskName { get; set; } // 任务项名称 public WeekEnum? ExecutionWeek { get; set; } // 执行周 public string ExecutionDate { get; set; } // 执行日期 public string ExecutionTime { get; set; } // 执行时间 public string Remark { get; set; } // 备注 public Guid? InspectionCardId { get; set; } // 所属任务单 // 导航属性 public virtual InspectionCard InspectionCard { get; set; } } ``` **调度功能:** - 按周期执行(每日、每周、每月) - 精确时间控制 - 任务状态跟踪 - 执行结果记录 #### 红外测温管理 (MeasureTemperaturePoint) **服务类**: `MeasureTemperaturePointAppService` **接口**: `IMeasureTemperaturePointAppService` **核心功能:** - 红外测温点配置 - 温度监控和报警 - 测温区域定义 - 遥测数据关联 **数据模型:** ```csharp public class MeasureTemperaturePoint : SOMSAuditedEntity, ISOMSPassivable { public int Number { get; set; } // 测温点号 public string Name { get; set; } // 测温点名称 public MeasureTemperatureTypeEnum MeasureTemperatureType { get; set; } // 测温类型 public string CoordinateJsonStr { get; set; } // 测温区域坐标 public Guid? TelemeteringConfigurationId { get; set; } // 关联遥测点 public float? Emissivity { get; set; } // 发射率 public float? Distance { get; set; } // 距离 public float? ReflectedTemperature { get; set; } // 反射温度 public Guid? PresetPointId { get; set; } // 关联预置点 public Guid? EquipmentTypeId { get; set; } // 设备类型 public Guid? EquipmentInfoId { get; set; } // 关联设备 // 导航属性 public virtual PresetPoint PresetPoint { get; set; } public virtual EquipmentType EquipmentType { get; set; } public virtual EquipmentInfo EquipmentInfo { get; set; } public virtual TelemeteringConfiguration TelemeteringConfiguration { get; set; } } public enum MeasureTemperatureTypeEnum { [Description("点")] Point = 1, [Description("线")] Line = 2, [Description("区域")] Area = 3 } ``` **测温功能:** - **点测温**: 单点温度测量 - **线测温**: 线性区域温度测量 - **区域测温**: 面积区域温度测量 **测温参数:** - **发射率**: 材料发射率设置 - **距离**: 测温距离补偿 - **反射温度**: 环境反射温度 - **坐标定义**: JSON格式区域坐标 #### 摄像机权限管理 (CameraAuthentication) **服务类**: `CameraAuthenticationAppService` **接口**: `ICameraAuthenticationAppService` **核心功能:** - 摄像机访问权限控制 - 用户权限分配 - 权限时效管理 - 权限状态监控 #### 照明控制 (LightingControl) **服务类**: `LightingControlAppService` **接口**: `ILightingControlAppService` **核心功能:** - 照明设备控制 - 亮度调节 - 定时开关控制 - 照明状态监控 #### 多维检测 (MultidimensionalCheck) **服务类**: `MultidimensionalCheckAppService` **接口**: `IMultidimensionalCheckAppService` **核心功能:** - 多维度数据检测 - 综合状态分析 - 异常模式识别 - 检测结果评估 #### 多维检测调度 (MultidimensionalCheckSchedule) **服务类**: `MultidimensionalCheckScheduleAppService` **接口**: `IMultidimensionalCheckScheduleAppService` **核心功能:** - 检测任务调度 - 定时检测计划 - 检测流程管理 - 调度状态监控 #### 模式识别 (PatternRecognition) **服务类**: `PatternRecognitionAppService` **接口**: `IPatternRecognitionAppService` **核心功能:** - 图像模式识别 - 异常检测算法 - 智能分析引擎 - 识别结果处理 **识别类型:** - 设备状态识别 - 异常情况检测 - 人员行为分析 - 环境变化监测 #### 视频设备与设备信息关联 (VideoDevEquipmentInfo) **服务类**: `VideoDevEquipmentInfoAppService` **接口**: `IVideoDevEquipmentInfoAppService` **核心功能:** - 视频设备与监控设备关联 - 关联关系管理 - 数据同步维护 - 关联状态监控 #### 巡检实时数据 (InspectionLiveData) **服务类**: `InspectionLiveDataAppService` **接口**: `IInspectionLiveDataAppService` **核心功能:** - 巡检过程实时数据 - 巡检状态监控 - 实时结果反馈 - 异常情况处理 #### 视频监控集成特性 **实时通信支持:** - WebSocket实时视频流 - SignalR状态推送 - 实时报警通知 - 设备状态更新 **数据存储策略:** - 配置数据SQL存储 - 巡检结果MongoDB存储 - 实时状态Redis缓存 - 图片文件系统存储 **外部系统集成:** - 主站系统任务下发 - 第三方视频平台集成 - 报警系统联动 - 移动端应用支持 **智能化功能:** - 自动巡检路径优化 - 智能异常检测 - 预测性维护建议 - 自适应参数调整 ### 系统管理 (System) 提供系统级管理功能,是SOMS系统的基础管理模块: #### 用户管理 (User) **服务类**: `UserAppService` **接口**: `IUserAppService` **核心功能:** - 用户账户全生命周期管理 - 用户权限分配和控制 - 密码策略和安全管理 - 用户状态监控 - 登录错误控制 **数据模型:** ```csharp public class SysUser : SOMSAuditedEntity, ISOMSPassivable { public string UserName { get; set; } // 用户名 public string Name { get; set; } // 姓名 public string Surname { get; set; } // 姓氏 public string Password { get; set; } // 密码 public string EmailAddress { get; set; } // 邮箱地址 public int ErrorTimes { get; set; } // 连续错误登录次数 public DateTime? LastLoginErrorDate { get; set; } // 最后错误登录时间 public bool IsOnline { get; set; } // 是否在线 public int UserPriority { get; set; } // 用户优先级 public string OrganizationalUnit { get; set; } // 组织单位 public bool IsActive { get; set; } // 是否活动 } ``` **主要方法:** ```csharp [HttpPost, Audited, Description("系统用户添加或修改")] public async Task> CreateOrUpdateAsync(EditUserInput input) [HttpPost, Description("查询系统用户信息")] public RequestPageResult FindDatas(PageSearchCondition searchCondition) [HttpGet, Audited, Description("删除系统用户单个信息")] public async Task DeleteByIdAsync(Guid id) ``` **安全特性:** - 密码复杂度验证 - 登录错误次数限制 - 账户锁定机制 - 在线状态跟踪 - 用户优先级控制 #### 角色管理 (Role) **服务类**: `RoleAppService` **接口**: `IRoleAppService` **核心功能:** - 角色定义和管理 - 权限配置和分配 - 角色继承关系 - 角色状态控制 **数据模型:** ```csharp public class SysRole : SOMSAuditedEntity, ISOMSPassivable { public string RoleName { get; set; } // 角色名称 public string Remark { get; set; } // 备注 public bool IsActive { get; set; } // 是否活动 public const string AdminRole = "超级管理员"; // 管理员角色常量 } ``` **主要方法:** ```csharp [HttpPost, Audited, Description("角色添加或修改")] public async Task> CreateOrUpdateAsync(EditRoleInput input) [HttpPost, Description("查询角色信息")] public RequestPageResult FindDatas(PageSearchCondition searchCondition) [HttpGet, Audited, Description("删除角色单个信息")] public async Task DeleteByIdAsync(Guid id) ``` **角色特性:** - 超级管理员角色 - 角色权限继承 - 角色状态管理 - 角色关联用户管理 #### 功能管理 (Function) **服务类**: `FunctionAppService` **接口**: `IFunctionAppService` **核心功能:** - 系统功能模块管理 - 菜单结构维护 - 功能权限控制 - 访问控制配置 **数据模型:** ```csharp public class SysFunction : SOMSAuditedEntity, ISOMSPassivable { public int SeqNo { get; set; } // 序号 public string Name { get; set; } // 功能名称 public string Code { get; set; } // 功能编码 public FunctionType Type { get; set; } // 功能类别 public string LoadUrl { get; set; } // 功能加载链接 public bool IsOperatorPage { get; set; } // 是否操作页面 public string Icon { get; set; } // 功能显示图标 public string Remark { get; set; } // 备注 public Guid? SysFunctionId { get; set; } // 父功能ID(自关联) } public enum FunctionType { [Description("浏览器端")] Web = 0, [Description("客户端")] Client = 1, [Description("运维客户端")] MaintenanceSystemClient = 2, } ``` **主要方法:** ```csharp [HttpPost, Audited, Description("系统功能信息添加或删除")] public async Task> CreateOrUpdateAsync(EditFunctionInput input) [HttpPost, Description("查询系统功能信息")] public RequestPageResult FindDatas(PageSearchCondition searchCondition) [HttpGet, Audited, Description("删除系统功能单个信息")] public async Task DeleteByIdAsync(Guid id) ``` **功能特性:** - 层级结构管理 - 多端支持(Web、客户端、运维客户端) - 图标和URL配置 - 操作页面标识 #### 角色用户关联 (RoleUser) **服务类**: `RoleUserAppService` **接口**: `IRoleUserAppService` **核心功能:** - 用户角色分配 - 角色用户关联管理 - 权限继承控制 **数据模型:** ```csharp public class SysRoleUser : SOMSAuditedEntity, ISOMSPassivable { public Guid? SysUserId { get; set; } // 关联用户ID public Guid? SysRoleId { get; set; } // 关联角色ID public bool IsActive { get; set; } // 是否活动 // 导航属性 public SysUser SysUser { get; set; } // 关联用户 public SysRole SysRole { get; set; } // 关联角色 } ``` #### 角色功能关联 (RoleFunction) **服务类**: `RoleFunctionAppService` **接口**: `IRoleFunctionAppService` **核心功能:** - 角色功能权限分配 - 功能访问控制 - 编辑权限管理 **数据模型:** ```csharp public class SysRoleFunction : SOMSAuditedEntity, ISOMSPassivable { public Guid? SysFunctionId { get; set; } // 关联功能ID public Guid? SysRoleId { get; set; } // 关联角色ID public bool IsEdit { get; set; } // 是否可编辑 public bool IsActive { get; set; } // 是否活动 // 导航属性 public SysFunction SysFunction { get; set; } // 关联功能 public SysRole SysRole { get; set; } // 关联角色 } ``` #### 配置管理 ##### 系统配置 (Configuration) **服务类**: `ConfigurationAppService` **接口**: `IConfigurationAppService` **核心功能:** - 系统参数配置管理 - 变电站级别配置 - 配置类型分类管理 - 配置值动态获取 **主要方法:** ```csharp [HttpGet, ShowApi, Description("获取系统配置")] public RequestResult GetSysConfongiguration([FromQuery] string name, Guid stationId) [HttpGet, ShowApi, Description("获取系统配置")] public RequestResult> GetSysConfongigurations([FromQuery] string? name, Guid stationId, SysConfigurationTypeEnum? type, string? code) [HttpPost, Audited, Description("系统配置添加或修改")] public async Task> CreateOrUpdateAsync(EditSysConfigurationInput input) ``` **配置特性:** - 变电站级别配置隔离 - 配置类型分类管理 - 配置代码标识 - 动态配置获取 ##### 通信配置 (CommunicationConfiguration) **服务类**: `CommunicationConfigurationService` **接口**: `ICommunicationConfigurationService` **核心功能:** - 实时通信参数配置 - WebSocket和SignalR配置 - 故障转移策略配置 - 消息压缩和持久化配置 **配置继承机制:** ``` 变电站特定配置 → 全局配置 → 系统默认值 ``` **缓存策略:** - MemoryCache本地缓存 - 配置更新自动清除缓存 - 缓存预热支持 - 滑动过期策略 **故障转移:** - 基于配置的智能故障转移 - WebSocket和SignalR自动切换 - 可配置重试次数和策略 ##### 全景配置 (PanoramaConfiguration) **服务类**: `PanoramaConfigurationAppService` **接口**: `IPanoramaConfigurationAppService` **核心功能:** - 全景图配置管理 - 全景场景管理 - 全景热点管理 - 数据库存储替代JSON文件 **数据模型:** ```csharp public class PanoramaConfiguration : SOMSAuditedEntity, ISOMSPassivable { public string Name { get; set; } // 配置名称 public string Description { get; set; } // 配置描述 public Guid? TransformerSubstationId { get; set; } // 所属变电站 // 导航属性 public virtual IEnumerable PanoramaScenes { get; set; } } public class PanoramaScene : SOMSAuditedEntity, ISOMSPassivable { public string SceneName { get; set; } // 场景名称 public string ImageUrl { get; set; } // 图片URL public Guid PanoramaConfigurationId { get; set; } // 所属配置 // 导航属性 public virtual IEnumerable PanoramaHotSpots { get; set; } } public class PanoramaHotSpot : SOMSAuditedEntity, ISOMSPassivable { public string HotSpotName { get; set; } // 热点名称 public string HotSpotType { get; set; } // 热点类型 public string Position { get; set; } // 位置坐标 public string TargetScene { get; set; } // 目标场景 public Guid PanoramaSceneId { get; set; } // 所属场景 } ``` **重构特性:** - 从JSON文件迁移到数据库 - 更好的数据管理和并发控制 - 支持数据关联和查询 - 提供标准CRUD操作 ##### URL配置 (AppUrlConfiguration) **服务类**: `AppUrlConfigurationService` **接口**: `IAppUrlConfigurationService` **核心功能:** - 应用URL地址配置 - 服务端点管理 - URL自动发现 - 配置动态更新 #### 权限控制体系 **RBAC模型:** ``` 用户 (User) → 角色 (Role) → 功能 (Function) ↓ ↓ ↓ SysUser → SysRoleUser → SysRoleFunction ``` **权限验证流程:** 1. 用户登录验证 2. 获取用户角色列表 3. 获取角色功能权限 4. 验证功能访问权限 5. 检查编辑权限 **权限特性:** - 基于角色的访问控制 - 功能级权限控制 - 编辑权限细分 - 权限继承机制 - 动态权限验证 #### 系统管理集成特性 **审计日志:** - 所有管理操作自动记录 - 用户操作轨迹跟踪 - 权限变更记录 - 配置修改历史 **数据一致性:** - 外键约束保证数据完整性 - 级联删除控制 - 数据变更事务管理 - 并发控制机制 **扩展性设计:** - 接口驱动架构 - 模块化服务设计 - 配置项动态扩展 - 多租户支持预留 ### 移动监控 (MobileSurveillance) 机器人巡检和移动监控系统,提供智能化巡检解决方案: #### 机器人管理 (RobotInfo) **服务类**: `RobotInfoAppService` **接口**: `IRobotInfoAppService` **核心功能:** - 机器人档案全生命周期管理 - 机器人状态实时监控 - 通信参数配置 - 摄像头设备关联 - 机器人类型管理 **数据模型:** ```csharp public class RobotInfo : SOMSAuditedEntity, ISOMSPassivable { public int? SeqNo { get; set; } // 序号 public string Name { get; set; } // 机器人名称 public string Code { get; set; } // 机器人编码(通讯用) public RobotTypeEnum? RobotType { get; set; } // 机器人类型 public string IP { get; set; } // IP地址 public int? Port { get; set; } // 端口号 public string Url { get; set; } // 通信URL public Guid? GeneralCameraId { get; set; } // 普通摄像头 public Guid? InfraredCameraId { get; set; } // 红外摄像头 public Guid? ManufacturerInfoId { get; set; } // 生产商 public Guid? TransformerSubstationId { get; set; } // 所属变电站 public string Remark { get; set; } // 备注 // 导航属性 public virtual VideoDev GeneralCamera { get; set; } // 普通摄像头 public virtual VideoDev InfraredCamera { get; set; } // 红外摄像头 public virtual ManufacturerInfo ManufacturerInfo { get; set; } public virtual TransformerSubstation TransformerSubstation { get; set; } } public enum RobotTypeEnum { [Description("轮式机器人")] 轮式机器人 = 10, [Description("轨道式机器人")] 轨道式机器人 = 20, [Description("其他")] 其他 = 999 } public enum RobotManufacturerCodeEnum { DaLi = 1, // 大立 GuoZi = 2 // 国自 } ``` **主要方法:** ```csharp [HttpPost, Audited, Description("机器人信息增加或修改")] public async Task> CreateOrUpdateAsync(EditRobotInfoInput input) [HttpPost, Description("查询机器人信息")] public RequestPageResult FindDatas(PageSearchCondition searchCondition) [HttpGet, Description("获取机器人类型下拉框数据")] public RequestResult> FindRobotTypeForSelect() [HttpGet, Description("获取机器人结构树")] public RequestResult> GetRobotTreeNode(RobotInfoSearchConditionInput searchCondition) [HttpGet, Description("根据机器人Id获取摄像头信息")] public RequestResult> GetCameraByRobotInfoId(Guid Id) ``` **特殊功能:** - 机器人编码唯一性验证 - 双摄像头配置(普通+红外) - HTTP通信方式支持 - 机器人树形结构展示 - 巡检报表目录管理 #### 机器人设备信息 (RobotDeviceInfo) **服务类**: `RobotDeviceInfoAppService` **接口**: `IRobotDeviceInfoAppService` **核心功能:** - 机器人设备点位管理 - 空轨设备关联 - 巡检主机服务配置 - 设备传感器管理 **数据模型:** ```csharp public class RobotDeviceInfo : SOMSAuditedEntity, ISOMSPassivable { public int? SeqNo { get; set; } // 序号 public string DeviceId { get; set; } // 设备ID public string DeviceName { get; set; } // 设备名称 public string DeviceType { get; set; } // 设备类型 public string DeviceStatus { get; set; } // 设备状态 public string CommunicationProtocol { get; set; } // 通信协议 public string ConfigurationParameters { get; set; } // 配置参数 public Guid? RobotInfoId { get; set; } // 关联机器人 public Guid? TransformerSubstationId { get; set; } // 所属变电站 // 导航属性 public virtual RobotInfo RobotInfo { get; set; } public virtual TransformerSubstation TransformerSubstation { get; set; } } ``` **设备管理特性:** - 设备点位精确定位 - 多种通信协议支持 - 设备状态实时监控 - 配置参数动态管理 #### 机器人任务 (RobotTask) **服务类**: `RobotTaskAppService` **接口**: `IRobotTaskAppService` **核心功能:** - 机器人任务调度管理 - 巡检路径规划 - 任务执行监控 - 任务优先级控制 - 定期任务配置 **数据模型:** ```csharp public class RobotTask : SOMSAuditedEntity, ISOMSPassivable { public string TaskName { get; set; } // 任务名称 public string TaskCode { get; set; } // 任务编码 public RobotActionEnum RobotAction { get; set; } // 机器人动作 public RobotTaskPriorityEnum Priority { get; set; } // 优先级 public DeviceLevelEnum DeviceLevel { get; set; } // 设备层级 public string DeviceList { get; set; } // 设备列表(逗号分隔) public DateTime? FixedStartTime { get; set; } // 定期开始时间 public string WeekCycle { get; set; } // 周期(周) public string DayCycle { get; set; } // 周期(日) public string TimeCycle { get; set; } // 周期(时间) public Guid? RobotInfoId { get; set; } // 关联机器人 public Guid? TransformerSubstationId { get; set; } // 所属变电站 // 导航属性 public virtual RobotInfo RobotInfo { get; set; } public virtual TransformerSubstation TransformerSubstation { get; set; } } public enum RobotActionEnum { [Description("自主充电")] 自主充电 = 0, [Description("定点巡检")] 定点巡检 = 1, [Description("路径巡检")] 路径巡检 = 2, [Description("返回充电桩")] 返回充电桩 = 3 } public enum RobotTaskPriorityEnum { [Description("优先级1")] 优先级1 = 1, [Description("优先级2")] 优先级2 = 2, [Description("优先级3")] 优先级3 = 3, [Description("优先级4")] 优先级4 = 4 } public enum DeviceLevelEnum { [Description("间隔")] 间隔 = 1, [Description("主设备")] 主设备 = 2, [Description("设备点位")] 设备点位 = 3 } ``` **任务调度特性:** - 多优先级任务队列 - 定时任务和周期任务 - 设备层级巡检 - 任务执行状态跟踪 - 自动充电管理 #### 机器人任务结果 (RobotTaskResult) **服务类**: `RobotTaskResultAppService` **接口**: `IRobotTaskResultAppService` **核心功能:** - 机器人巡检结果管理 - 任务执行状态记录 - 巡检数据分析 - 异常情况处理 #### 机器人任务项结果 (RobotTaskItemResult) **服务类**: `RobotTaskItemResultAppService` **接口**: `IRobotTaskItemResultAppService` **核心功能:** - 任务项级别结果记录 - 详细巡检数据管理 - 图片和视频文件管理 - 测温数据记录 **集成特性:** - 与主站系统数据同步 - 自动上传巡检结果 - 延时处理机制 - 异常重试机制 ### 运维管理 (MaintenanceAndOperations) 设备维护和运行操作管理系统: #### 维护系统 (MaintenanceSystem) **服务类**: `MaintenanceSystemInfoAppService` **接口**: `IMaintenanceSystemInfoAppService` **核心功能:** - 维护系统信息管理 - 维护模块版本控制 - 维护计划制定 - 工单管理系统 - 备件库存管理 **数据模型:** ```csharp public class MaintenanceSystemInfoOutput : Entity { public string Name { get; set; } // 功能名称 public string Version { get; set; } // 版本号 public DateTime UpdateTime { get; set; } // 更新时间 public string Remark { get; set; } // 备注 } ``` **维护模块:** - 定值管理模块 - 板卡诊断模块 - 智能报告模块 - 极性校验模块 - 后台服务 - 客户端 - 数据服务 **维护功能:** - 设备维护计划制定 - 维护工单生成和跟踪 - 维护历史记录管理 - 备件需求分析 - 维护成本统计 #### 继电保护设置管理 (RelaySettingsManagement) **服务类**: `RelaySettingAppService` **接口**: `IRelaySettingAppService` **核心功能:** - 继电保护参数管理 - 保护定值配置 - 定值版本控制 - 定值下发和校验 - 保护动作分析 **保护定值管理:** - 定值参数配置 - 定值文件管理 - 定值变更记录 - 定值校验功能 - 定值备份恢复 **版本控制:** - 定值版本管理 - 变更历史追踪 - 版本比较功能 - 回滚操作支持 #### 二次设备管理 (SecondaryEquipment) **服务类**: `SecondaryEquipmentAppService` **接口**: `ISecondaryEquipmentAppService` **核心功能:** - 二次设备档案管理 - 设备接线图管理 - 设备试验记录 - 设备状态监控 - 设备维护记录 **二次回路管理:** ```csharp public class SecondaryCircuitProtectionDevice : Entity { public Guid SecondaryCircuitId { get; set; } // 二次回路ID public Guid ProtectionDeviceId { get; set; } // 保护装置ID public string Remark { get; set; } // 备注 public bool IsActive { get; set; } // 是否在用 // 导航属性 public virtual SecondaryCircuit SecondaryCircuit { get; set; } public virtual ProtectionDeviceInfo ProtectionDevice { get; set; } } ``` **设备管理特性:** - 二次设备分类管理 - 设备技术参数记录 - 设备运行状态监控 - 设备维护计划 - 设备故障诊断 #### 运维集成特性 **ISMS系统集成:** - 与ISMS保护装置数据同步 - 保护动作记录同步 - 定值管理集成 - 设备状态实时更新 **数据管理:** - 运维数据统一管理 - 历史数据归档 - 数据分析和报表 - 数据备份和恢复 **移动端支持:** - 移动运维应用 - 现场数据采集 - 实时状态查询 - 移动工单处理 **智能化功能:** - 预测性维护 - 智能故障诊断 - 维护计划优化 - 成本效益分析 ## 技术栈 ### 核心框架 - **ABP Framework**: 应用框架基础 - **ASP.NET Core**: Web API框架 - **Entity Framework Core**: ORM数据访问 - **AutoMapper**: 对象映射 ### 数据存储 - **SQL Server**: 关系型数据库 - **MongoDB**: 文档数据库 - **Redis**: 内存缓存 ### 通信技术 - **SignalR**: 实时通信 - **WebSocket**: 双向通信 - **RESTful API**: HTTP接口 ### 开发工具 - **Dependency Injection**: 依赖注入 - **Serilog**: 结构化日志 - **Swagger**: API文档 - **JWT**: 身份认证 ## 开发指南 ### 创建新的应用服务 1. **定义接口** ```csharp public interface IMyAppService : IAppServiceBase { // 自定义方法 Task> CustomMethodAsync(MyCustomInput input); } ``` 2. **实现服务类** ```csharp [Description("我的应用服务")] public class MyAppService : SOMSAppServiceBase, IMyAppService { private readonly IRepository _repository; public MyAppService( ISessionAppService sessionAppService, IRepository repository) : base(sessionAppService) { _repository = repository; } [HttpPost, Audited, Description("创建或更新")] public async Task> CreateOrUpdateAsync(MyEditInput input) { // 实现业务逻辑 } } ``` 3. **注册服务** ```csharp // 在模块的Initialize方法中自动注册 IocManager.RegisterAssemblyByConvention(assembly); ``` ### 数据传输对象(DTO)设计 ```csharp // 搜索条件 public class MySearchInput { public string Name { get; set; } public Guid? CategoryId { get; set; } public DateTime? StartDate { get; set; } } // 输出对象 public class MyOutput : EntityDto { public string Name { get; set; } public string Description { get; set; } public DateTime CreationTime { get; set; } } // 编辑输入 public class MyEditInput : EntityDto { [Required] public string Name { get; set; } public string Description { get; set; } } ``` ### 权限控制 ```csharp [AbpAuthorize("MyPermission")] public async Task> SecureMethodAsync(MyInput input) { // 需要特定权限才能访问 } [AbpAllowAnonymous] public RequestResult> PublicMethodAsync() { // 允许匿名访问 } ``` ### 审计日志 ```csharp [Audited] [Description("重要操作")] public async Task ImportantOperationAsync(MyInput input) { // 操作会被自动记录到审计日志 } ``` ### 缓存使用 ```csharp public class MyAppService : SOMSAppServiceBase { private readonly IRedisRepository _redisRepository; public async Task GetCachedDataAsync(string key) { return await _redisRepository.GetAsync(key); } public async Task SetCachedDataAsync(string key, MyData data) { await _redisRepository.SetAsync(key, data, TimeSpan.FromMinutes(30)); } } ``` ## API文档 ### 标准API响应格式 YunDa.SOMS.Application 采用统一的API响应格式,确保前端和客户端的一致性处理。 #### 成功响应 (RequestResult) ```json { "flag": true, "message": "操作成功", "resultData": { "id": "550e8400-e29b-41d4-a716-446655440000", "name": "示例设备", "code": "DEV001", "creationTime": "2024-01-15T10:30:00Z" } } ``` #### 分页响应 (RequestPageResult) ```json { "flag": true, "message": "查询成功", "resultData": [ { "id": "550e8400-e29b-41d4-a716-446655440000", "name": "设备1", "code": "DEV001" }, { "id": "550e8400-e29b-41d4-a716-446655440001", "name": "设备2", "code": "DEV002" } ], "totalCount": 150, "pageIndex": 1, "pageSize": 20 } ``` #### 简单响应 (RequestEasyResult) ```json { "flag": true, "message": "删除成功" } ``` #### 错误响应 ```json { "flag": false, "message": "设备编码已存在,请使用其他编码", "resultData": null } ``` ### API端点规范 #### URL命名规范 ``` /api/SOMS/{ModuleName}/{Action} ``` **示例:** - `/api/SOMS/EquipmentInfo/FindDatas` - 查询设备信息 - `/api/SOMS/TelemeteringConfiguration/CreateOrUpdate` - 创建或更新遥测配置 - `/api/SOMS/VideoDev/DeleteById` - 删除视频设备 #### HTTP方法使用 - **GET**: 查询单个资源、获取下拉框数据、获取配置信息 - **POST**: 查询列表数据、创建或更新资源、复杂查询操作 - **DELETE**: 删除资源(较少使用,多数使用POST方式) ### 核心API端点 #### 数据监控模块 ##### 遥测配置管理 ```http # 查询遥测配置 POST /api/SOMS/TelemeteringConfiguration/FindDatas Content-Type: application/json { "pageIndex": 1, "pageSize": 20, "searchCondition": { "name": "电压", "equipmentInfoId": "550e8400-e29b-41d4-a716-446655440000", "transformerSubstationId": "550e8400-e29b-41d4-a716-446655440001" } } # 创建或更新遥测配置 POST /api/SOMS/TelemeteringConfiguration/CreateOrUpdate Content-Type: application/json { "id": null, "name": "A相电压", "unit": "kV", "coefficient": 1.0, "decimalDigits": 2, "infoAddress": 1001, "deviceAddress": 1, "dispatcherAddress": 1001, "equipmentInfoId": "550e8400-e29b-41d4-a716-446655440000", "transformerSubstationId": "550e8400-e29b-41d4-a716-446655440001" } # 获取环境温度 GET /api/SOMS/TelemeteringConfiguration/GetEnvironmentTempValue?transubstationId=550e8400-e29b-41d4-a716-446655440001 ``` ##### 遥信配置管理 ```http # 查询遥信配置 POST /api/SOMS/TelesignalisationConfiguration/FindDatas Content-Type: application/json { "pageIndex": 1, "pageSize": 20, "searchCondition": { "name": "开关", "equipmentTypeId": "550e8400-e29b-41d4-a716-446655440002" } } # 获取遥信下拉框数据 GET /api/SOMS/TelesignalisationConfiguration/FindTelesignalisationConfigurationForSelect?transformerSubstationId=550e8400-e29b-41d4-a716-446655440001 ``` ##### 遥控配置管理 ```http # 创建或更新遥控配置 POST /api/SOMS/TelecommandConfiguration/CreateOrUpdate Content-Type: application/json { "id": null, "name": "断路器分闸", "remoteType": 1, "infoAddress": 2001, "deviceAddress": 1, "dispatcherAddress": 2001, "relatedTelesignalisationId": "550e8400-e29b-41d4-a716-446655440003", "equipmentInfoId": "550e8400-e29b-41d4-a716-446655440000" } ``` #### 综合信息管理模块 ##### 设备信息管理 ```http # 查询设备信息 POST /api/SOMS/EquipmentInfo/FindDatas Content-Type: application/json { "pageIndex": 1, "pageSize": 20, "searchCondition": { "name": "变压器", "equipmentTypeId": "550e8400-e29b-41d4-a716-446655440004", "transformerSubstationId": "550e8400-e29b-41d4-a716-446655440001" } } # 创建或更新设备信息 POST /api/SOMS/EquipmentInfo/CreateOrUpdate Content-Type: application/json { "id": null, "name": "主变压器T1", "code": "T1", "equipmentTypeId": "550e8400-e29b-41d4-a716-446655440004", "manufacturerInfoId": "550e8400-e29b-41d4-a716-446655440005", "transformerSubstationId": "550e8400-e29b-41d4-a716-446655440001", "isRemoteControl": true, "safetyStateType": 1 } # 刷新安全状态 GET /api/SOMS/EquipmentInfo/FreshSafetyState # 同步模板配置 POST /api/SOMS/EquipmentInfo/SyncTeleTemplate ``` ##### 变电站管理 ```http # 查询变电站信息 POST /api/SOMS/TransformerSubstation/FindDatas Content-Type: application/json { "pageIndex": 1, "pageSize": 20, "searchCondition": { "substationName": "220kV" } } # 创建或更新变电站 POST /api/SOMS/TransformerSubstation/CreateOrUpdate Content-Type: application/json { "id": null, "substationName": "220kV东郊变电站", "commMgrIP": "192.168.1.100", "longitude": 116.407526, "latitude": 39.904030, "masterStationAddress": "http://192.168.1.200:8080" } ``` #### 视频监控模块 ##### 视频设备管理 ```http # 查询视频设备 POST /api/SOMS/VideoDev/FindDatas Content-Type: application/json { "pageIndex": 1, "pageSize": 20, "searchCondition": { "name": "球机", "videoDevType": 3, "transformerSubstationId": "550e8400-e29b-41d4-a716-446655440001" } } # 创建或更新视频设备 POST /api/SOMS/VideoDev/CreateOrUpdate Content-Type: application/json { "id": null, "name": "主控室球机", "ip": "192.168.1.101", "port": 8000, "devUserName": "admin", "devPassword": "admin123", "channelNo": 1, "videoDevType": 3, "installationArea": "主控室", "transformerSubstationId": "550e8400-e29b-41d4-a716-446655440001" } ``` ##### 预置点管理 ```http # 查询预置点 POST /api/SOMS/PresetPoint/FindDatas Content-Type: application/json { "pageIndex": 1, "pageSize": 20, "searchCondition": { "videoDevId": "550e8400-e29b-41d4-a716-446655440006" } } # 创建或更新预置点 POST /api/SOMS/PresetPoint/CreateOrUpdate Content-Type: application/json { "id": null, "number": 1, "name": "主变压器监控点", "videoDevId": "550e8400-e29b-41d4-a716-446655440006", "equipmentInfoId": "550e8400-e29b-41d4-a716-446655440000" } ``` ##### 巡检管理 ```http # 查询巡检任务单 POST /api/SOMS/InspectionCard/FindDatas Content-Type: application/json { "pageIndex": 1, "pageSize": 20, "searchCondition": { "cardName": "日常巡检", "transformerSubstationId": "550e8400-e29b-41d4-a716-446655440001" } } # 查询巡检计划任务 POST /api/SOMS/InspectionPlanTask/FindDatas Content-Type: application/json { "pageIndex": 1, "pageSize": 20, "searchCondition": { "inspectionCardId": "550e8400-e29b-41d4-a716-446655440007" } } ``` #### 系统管理模块 ##### 用户管理 ```http # 查询用户信息 POST /api/SOMS/User/FindDatas Content-Type: application/json { "pageIndex": 1, "pageSize": 20, "searchCondition": { "userName": "admin", "name": "管理员" } } # 创建或更新用户 POST /api/SOMS/User/CreateOrUpdate Content-Type: application/json { "id": null, "userName": "operator01", "name": "操作员1", "surname": "张", "password": "Password123!", "emailAddress": "operator01@company.com", "userPriority": 2, "organizationalUnit": "运维部" } ``` ##### 角色管理 ```http # 查询角色信息 POST /api/SOMS/Role/FindDatas Content-Type: application/json { "pageIndex": 1, "pageSize": 20, "searchCondition": { "roleName": "操作员" } } # 创建或更新角色 POST /api/SOMS/Role/CreateOrUpdate Content-Type: application/json { "id": null, "roleName": "高级操作员", "remark": "具有高级操作权限的操作员角色" } ``` #### 移动监控模块 ##### 机器人管理 ```http # 查询机器人信息 POST /api/SOMS/RobotInfo/FindDatas Content-Type: application/json { "pageIndex": 1, "pageSize": 20, "searchCondition": { "name": "巡检机器人", "robotType": 10, "transformerSubstationId": "550e8400-e29b-41d4-a716-446655440001" } } # 创建或更新机器人 POST /api/SOMS/RobotInfo/CreateOrUpdate Content-Type: application/json { "id": null, "name": "轮式巡检机器人R1", "code": "ROBOT001", "robotType": 10, "ip": "192.168.1.150", "port": 8080, "url": "http://192.168.1.150:8080/api", "transformerSubstationId": "550e8400-e29b-41d4-a716-446655440001" } # 获取机器人类型下拉框 GET /api/SOMS/RobotInfo/FindRobotTypeForSelect # 获取机器人结构树 GET /api/SOMS/RobotInfo/GetRobotTreeNode?transformerSubstationId=550e8400-e29b-41d4-a716-446655440001 ``` ### API认证和授权 #### JWT Token认证 ```http # 用户登录 POST /api/TokenAuth/Authenticate Content-Type: application/json { "userName": "admin", "password": "admin123" } # 响应 { "flag": true, "message": "登录成功!", "accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...", "encryptedAccessToken": "encrypted_token_string", "expireInSeconds": 2147483647, "userId": "550e8400-e29b-41d4-a716-446655440000" } ``` #### API调用示例 ```http # 使用Token调用API POST /api/SOMS/EquipmentInfo/FindDatas Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... Content-Type: application/json { "pageIndex": 1, "pageSize": 20, "searchCondition": {} } ``` ### 错误处理 #### 常见错误码 - **400 Bad Request**: 请求参数错误 - **401 Unauthorized**: 未授权访问 - **403 Forbidden**: 权限不足 - **404 Not Found**: 资源不存在 - **500 Internal Server Error**: 服务器内部错误 #### 错误响应示例 ```json { "flag": false, "message": "设备编码不能为空", "resultData": null, "errorCode": "VALIDATION_ERROR", "details": [ { "field": "code", "message": "设备编码是必填字段" } ] } ``` ## 最佳实践 ### 1. 服务设计原则 #### SOLID原则应用 **单一职责原则 (SRP)** ```csharp // ✅ 好的做法:专注于设备信息管理 public class EquipmentInfoAppService : SOMSAppServiceBase, IEquipmentInfoAppService { // 只处理设备信息相关的业务逻辑 public async Task> CreateOrUpdateAsync(EditEquipmentInfoInput input) public RequestPageResult FindDatas(PageSearchCondition searchCondition) } // ❌ 避免:在一个服务中处理多种不相关的业务 public class MixedAppService : SOMSAppServiceBase { // 不要在同一个服务中混合设备管理、用户管理、报警管理等 } ``` **接口隔离原则 (ISP)** ```csharp // ✅ 好的做法:细分接口 public interface IEquipmentInfoQueryService { RequestPageResult FindDatas(PageSearchCondition searchCondition); RequestResult GetById(Guid id); } public interface IEquipmentInfoCommandService { Task> CreateOrUpdateAsync(EditEquipmentInfoInput input); Task DeleteByIdAsync(Guid id); } ``` **依赖倒置原则 (DIP)** ```csharp // ✅ 好的做法:依赖抽象 public class TelemeteringConfigurationAppService : SOMSAppServiceBase { private readonly IRepository _repository; private readonly IRedisRepository _redisRepository; public TelemeteringConfigurationAppService( IRepository repository, IRedisRepository redisRepository) { _repository = repository; _redisRepository = redisRepository; } } ``` ### 2. 异常处理最佳实践 #### 统一异常处理模式 ```csharp public async Task> MyMethodAsync(MyInput input) { var result = new RequestResult(); try { // 1. 输入验证 if (input == null) { result.Flag = false; result.Message = "输入参数不能为空"; return result; } // 2. 业务逻辑处理 var data = await ProcessBusinessLogicAsync(input); // 3. 成功响应 result.Flag = true; result.ResultData = data; result.Message = "操作成功"; } catch (BusinessException ex) { // 业务异常:返回友好错误信息 result.Flag = false; result.Message = ex.Message; Log4Helper.Warning(this.GetType(), "业务异常", ex); } catch (ValidationException ex) { // 验证异常:返回验证错误信息 result.Flag = false; result.Message = "数据验证失败:" + ex.Message; Log4Helper.Info(this.GetType(), "验证异常", ex); } catch (Exception ex) { // 系统异常:记录详细日志,返回通用错误信息 result.Flag = false; result.Message = "系统异常,请联系管理员"; Log4Helper.Error(this.GetType(), "系统异常", ex); } return result; } ``` #### 自定义业务异常 ```csharp public class EquipmentCodeDuplicateException : BusinessException { public EquipmentCodeDuplicateException(string code) : base($"设备编码 '{code}' 已存在,请使用其他编码") { } } // 使用示例 if (await IsEquipmentCodeExistsAsync(input.Code)) { throw new EquipmentCodeDuplicateException(input.Code); } ``` ### 3. 性能优化策略 #### 异步编程 ```csharp // ✅ 好的做法:使用异步方法 public async Task>> GetEquipmentListAsync() { var equipments = await _equipmentRepository.GetAllListAsync(); var manufacturers = await _manufacturerRepository.GetAllListAsync(); // 并行处理 var tasks = equipments.Select(async equipment => { var output = ObjectMapper.Map(equipment); output.ManufacturerName = manufacturers.FirstOrDefault(m => m.Id == equipment.ManufacturerInfoId)?.ManufacturerName; return output; }); var results = await Task.WhenAll(tasks); return new RequestResult> { Flag = true, ResultData = results.ToList() }; } ``` #### 缓存策略 ```csharp public class TelemeteringConfigurationAppService : SOMSAppServiceBase { private readonly IMemoryCache _memoryCache; private readonly IRedisRepository _redisRepository; public async Task> GetEnvironmentTempValue(Guid? transubstationId) { // 1. 内存缓存 var cacheKey = $"env_temp_{transubstationId}"; if (_memoryCache.TryGetValue(cacheKey, out float cachedValue)) { return new RequestResult { Flag = true, ResultData = cachedValue }; } // 2. Redis缓存 var redisKey = $"EnvironmentTempValue_{transubstationId}"; var redisValue = await _redisRepository.GetAsync(redisKey); if (redisValue != null) { _memoryCache.Set(cacheKey, redisValue.Value, TimeSpan.FromMinutes(5)); return new RequestResult { Flag = true, ResultData = redisValue.Value }; } // 3. 数据库查询 var dbValue = await GetEnvironmentTempFromDatabaseAsync(transubstationId); // 4. 更新缓存 await _redisRepository.SetAsync(redisKey, new EnvironmentTempValue { Value = dbValue }, TimeSpan.FromMinutes(30)); _memoryCache.Set(cacheKey, dbValue, TimeSpan.FromMinutes(5)); return new RequestResult { Flag = true, ResultData = dbValue }; } } ``` #### 分页查询优化 ```csharp public RequestPageResult FindDatas(PageSearchCondition searchCondition) { var query = _equipmentRepository.GetAllIncluding( e => e.EquipmentType, e => e.ManufacturerInfo, e => e.TransformerSubstation) .WhereIf(!string.IsNullOrWhiteSpace(searchCondition.SearchCondition.Name), e => e.Name.Contains(searchCondition.SearchCondition.Name)) .WhereIf(searchCondition.SearchCondition.EquipmentTypeId.HasValue, e => e.EquipmentTypeId == searchCondition.SearchCondition.EquipmentTypeId) .WhereIf(searchCondition.SearchCondition.TransformerSubstationId.HasValue, e => e.TransformerSubstationId == searchCondition.SearchCondition.TransformerSubstationId); // 先获取总数(避免加载所有数据) var totalCount = query.Count(); // 分页查询 var pagedData = query .OrderBy(e => e.SeqNo) .ThenBy(e => e.Name) .Skip((searchCondition.PageIndex - 1) * searchCondition.PageSize) .Take(searchCondition.PageSize) .ToList(); var result = ObjectMapper.Map>(pagedData); return new RequestPageResult { Flag = true, ResultData = result, TotalCount = totalCount, PageIndex = searchCondition.PageIndex, PageSize = searchCondition.PageSize }; } ``` ### 4. 安全最佳实践 #### 输入验证 ```csharp [HttpPost, Audited, Description("设备信息增加或修改")] public async Task> CreateOrUpdateAsync(EditEquipmentInfoInput input) { // 1. 基础验证 if (input == null) return new RequestResult { Flag = false, Message = "输入参数不能为空" }; // 2. 业务规则验证 if (string.IsNullOrWhiteSpace(input.Name)) return new RequestResult { Flag = false, Message = "设备名称不能为空" }; if (string.IsNullOrWhiteSpace(input.Code)) return new RequestResult { Flag = false, Message = "设备编码不能为空" }; // 3. 数据格式验证 if (input.Code.Length > 50) return new RequestResult { Flag = false, Message = "设备编码长度不能超过50个字符" }; // 4. 业务唯一性验证 if (await IsEquipmentCodeDuplicateAsync(input.Code, input.Id)) return new RequestResult { Flag = false, Message = "设备编码已存在" }; // 5. 权限验证(通过特性自动处理) // [AbpAuthorize("Equipment.Create")] 或 [AbpAuthorize("Equipment.Update")] return input.Id.HasValue ? await UpdateAsync(input) : await CreateAsync(input); } ``` #### 权限控制 ```csharp // 方法级权限控制 [AbpAuthorize("Equipment.Create")] public async Task> CreateAsync(EditEquipmentInfoInput input) [AbpAuthorize("Equipment.Update")] public async Task> UpdateAsync(EditEquipmentInfoInput input) [AbpAuthorize("Equipment.Delete")] public async Task DeleteByIdAsync(Guid id) // 匿名访问(谨慎使用) [AbpAllowAnonymous] public RequestResult> GetEquipmentTypesForSelect() ``` #### SQL注入防护 ```csharp // ✅ 好的做法:使用LINQ和参数化查询 var equipments = _equipmentRepository.GetAll() .Where(e => e.Name.Contains(searchName)) .Where(e => e.TransformerSubstationId == stationId) .ToList(); // ✅ 好的做法:使用参数化原生SQL var sql = "SELECT * FROM gi_equipment_info WHERE Name LIKE @name AND TransformerSubstationId = @stationId"; var parameters = new { name = $"%{searchName}%", stationId = stationId }; var result = await _repository.QueryAsync(sql, parameters); // ❌ 避免:字符串拼接SQL var badSql = $"SELECT * FROM gi_equipment_info WHERE Name LIKE '%{searchName}%'"; // 存在SQL注入风险 ``` ### 5. 测试策略 #### 单元测试示例 ```csharp [Test] public async Task CreateEquipmentInfo_WithValidInput_ShouldReturnSuccess() { // Arrange var input = new EditEquipmentInfoInput { Name = "测试设备", Code = "TEST001", EquipmentTypeId = Guid.NewGuid(), TransformerSubstationId = Guid.NewGuid() }; var mockRepository = new Mock>(); var mockSessionService = new Mock(); var service = new EquipmentInfoAppService(mockRepository.Object, mockSessionService.Object); // Act var result = await service.CreateOrUpdateAsync(input); // Assert Assert.IsTrue(result.Flag); Assert.IsNotNull(result.ResultData); Assert.AreEqual("测试设备", result.ResultData.Name); } [Test] public async Task CreateEquipmentInfo_WithDuplicateCode_ShouldReturnError() { // Arrange var input = new EditEquipmentInfoInput { Name = "测试设备", Code = "DUPLICATE001" }; // 模拟编码重复 var mockRepository = new Mock>(); mockRepository.Setup(r => r.FirstOrDefaultAsync(It.IsAny>>())) .ReturnsAsync(new EquipmentInfo { Code = "DUPLICATE001" }); var service = new EquipmentInfoAppService(mockRepository.Object, Mock.Of()); // Act var result = await service.CreateOrUpdateAsync(input); // Assert Assert.IsFalse(result.Flag); Assert.IsTrue(result.Message.Contains("编码已存在")); } ``` #### 集成测试示例 ```csharp [Test] public async Task EquipmentInfo_CRUD_Integration_Test() { // 使用真实数据库连接进行集成测试 using var scope = _serviceProvider.CreateScope(); var service = scope.ServiceProvider.GetRequiredService(); // 1. 创建设备 var createInput = new EditEquipmentInfoInput { Name = "集成测试设备", Code = "INTEGRATION001" }; var createResult = await service.CreateOrUpdateAsync(createInput); Assert.IsTrue(createResult.Flag); var equipmentId = createResult.ResultData.Id; // 2. 查询设备 var queryResult = service.FindDatas(new PageSearchCondition { SearchCondition = new EquipmentInfoSearchConditionInput { Name = "集成测试设备" }, PageIndex = 1, PageSize = 10 }); Assert.IsTrue(queryResult.Flag); Assert.AreEqual(1, queryResult.ResultData.Count); // 3. 更新设备 var updateInput = new EditEquipmentInfoInput { Id = equipmentId, Name = "更新后的设备名称", Code = "INTEGRATION001" }; var updateResult = await service.CreateOrUpdateAsync(updateInput); Assert.IsTrue(updateResult.Flag); Assert.AreEqual("更新后的设备名称", updateResult.ResultData.Name); // 4. 删除设备 var deleteResult = await service.DeleteByIdAsync(equipmentId); Assert.IsTrue(deleteResult.Flag); } ``` ### 6. 代码质量保证 #### 代码审查清单 - [ ] 是否遵循命名规范 - [ ] 是否有适当的异常处理 - [ ] 是否有输入验证 - [ ] 是否有权限控制 - [ ] 是否有日志记录 - [ ] 是否有单元测试 - [ ] 是否有性能考虑 - [ ] 是否有安全考虑 #### 性能监控 ```csharp public async Task> MonitoredMethodAsync(Func>> operation, string operationName) { var stopwatch = Stopwatch.StartNew(); try { var result = await operation(); stopwatch.Stop(); Log4Helper.Info(this.GetType(), $"{operationName} 执行完成,耗时: {stopwatch.ElapsedMilliseconds}ms"); if (stopwatch.ElapsedMilliseconds > 5000) // 超过5秒记录警告 { Log4Helper.Warning(this.GetType(), $"{operationName} 执行时间过长: {stopwatch.ElapsedMilliseconds}ms"); } return result; } catch (Exception ex) { stopwatch.Stop(); Log4Helper.Error(this.GetType(), $"{operationName} 执行失败,耗时: {stopwatch.ElapsedMilliseconds}ms", ex); throw; } } ``` ### 7. 部署和运维 #### 配置管理 ```json { "ConnectionStrings": { "Default": "Server=localhost;Database=SOMS;Trusted_Connection=true;", "Redis": "localhost:6379", "MongoDB": "mongodb://localhost:27017/SOMS" }, "SysBaseConfig": { "SysAttachmentFolder": "/app/data/attachments", "MaxDataCount": 10000, "MasterStationType": 1 }, "Logging": { "LogLevel": { "Default": "Information", "YunDa.SOMS": "Debug" } } } ``` #### 健康检查 ```csharp public class SOMSHealthCheck : IHealthCheck { private readonly IRepository _equipmentRepository; private readonly IRedisRepository _redisRepository; public async Task CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken = default) { try { // 检查数据库连接 await _equipmentRepository.CountAsync(); // 检查Redis连接 await _redisRepository.SetAsync("health_check", "ok", TimeSpan.FromMinutes(1)); return HealthCheckResult.Healthy("SOMS应用服务正常"); } catch (Exception ex) { return HealthCheckResult.Unhealthy("SOMS应用服务异常", ex); } } } ``` --- ## 总结 YunDa.SOMS.Application 应用层是整个SOMS系统的核心业务逻辑层,提供了完整的变电站运维管理功能。通过本文档,开发人员可以: 1. **理解系统架构**: 掌握应用层的整体设计和模块划分 2. **快速上手开发**: 了解开发规范和最佳实践 3. **正确使用API**: 掌握各模块的API接口和调用方法 4. **保证代码质量**: 遵循安全、性能和可维护性要求 ### 技术特色 - **模块化设计**: 清晰的业务模块划分,便于维护和扩展 - **统一的基础设施**: 通用的基类和接口,提高开发效率 - **完善的权限控制**: 基于角色的访问控制,确保系统安全 - **实时通信支持**: WebSocket和SignalR双通道实时数据推送 - **多数据源支持**: SQL Server、MongoDB、Redis多数据源集成 - **智能化功能**: 联动策略、模式识别、预测性维护等智能特性 ### 持续改进 本文档将随着系统的发展持续更新,如有问题或建议,请联系开发团队。 **联系方式:** - 技术支持: tech-support@yunda.com - 文档反馈: docs-feedback@yunda.com - 项目地址: [内部GitLab地址] --- *最后更新时间: 2024年1月15日* *文档版本: v1.0* *适用系统版本: SOMS v2.0+*