# RouterService 逻辑修复与新方法设计 > **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:writing-plans to create implementation plan. **Goal:** 修复 `RouterService` 中已发现的逻辑错误,新增 5 个路由查询/管理方法,并更新接口层。 **Architecture:** 在现有 `RouterService` 基础上新增缓存管理方法和路由查询增强方法,保持现有缓存架构不变。 **Tech Stack:** ASP.NET Core 6.0, HybridCacheService, SqlSugar ORM --- ## 一、现有逻辑问题修复 ### 1.1 AddRouters 缓存一致性 **问题**:`BaseDal.AddData` 和 `_cacheService.AddOrUpdate` 之间无保护。如果 `AddOrUpdate` 抛异常,DB 已写入但缓存未更新,下次查询读到旧数据。 **修复**:使用 try-finally 逻辑,保证 DB 写入后再更新缓存。如果缓存更新失败,下次查询会从 DB 自动重建缓存(`GetOrAdd` 懒加载保证)。 ### 1.2 QueryAllPositions 空 catch 块 **问题**:catch 块仅有注释,无实际日志记录。异常被静默吞掉,调用方无法区分"没有数据"和"查询失败"。 **修复**:增加 `ConsoleHelper.WriteErrorLine` 记录错误。 ### 1.3 接口层 public 修饰符 **问题**:`IRouterService` 中的方法签名有多余的 `public` 修饰符。 **修复**:移除接口方法上的 `public` 修饰符。 --- ## 二、新增方法设计 ### 2.1 ClearRouterCache() 清除 `Router:AllRouters:In` 和 `Router:AllRouters:Out` 两个缓存键。 **签名**:`void ClearRouterCache()` **实现**: ```csharp _cacheService.Remove("Router:AllRouters:In"); _cacheService.Remove("Router:AllRouters:Out"); ``` ### 2.2 QueryRoutersByDeviceCode(string deviceCode) 查询经过指定设备的所有路由(合并入口/出口类型)。 **签名**:`List QueryRoutersByDeviceCode(string deviceCode)` **逻辑**:从缓存加载 In + Out 路由,筛选 `ChildPosiDeviceCode == deviceCode` 的路由。 **缓存**:不独占缓存,直接使用现有 `GetAllRoutersFromCache` 获取数据。 ### 2.3 ExistsRouter(两个重载) 判断两点之间是否存在路由。 **签名**: - `bool ExistsRouter(string startPosi, string endPosi)` — 全类型 - `bool ExistsRouter(string startPosi, string endPosi, int routeType)` — 指定类型 **逻辑**:调用 `FindRoutesInMemory`,返回 `routers.Count > 0`。 ### 2.4 GetRouterCount(两个重载) 返回路由数量。 **签名**: - `int GetRouterCount()` — 合并 In + Out 总数 - `int GetRouterCount(int routeType)` — 指定类型数量 **实现**:从缓存获取后 `.Count`。 ### 2.5 DeleteRouters(List routerIds) 批量删除指定 ID 的路由,删除后同步清除对应类型缓存。 **签名**:`WebResponseContent DeleteRouters(List routerIds)` **逻辑**: 1. 查出待删除路由各自的 `InOutType` 2. `BaseDal.DeleteData` 批量删除 3. 根据涉及的 `InOutType` 清除对应缓存键 4. 返回 `WebResponseContent` --- ## 三、涉及文件 | 文件 | 改动 | |------|------| | `WIDESEAWCS_QuartzJob/Service/RouterService.cs` | 修复逻辑 + 新增方法实现 | | `WIDESEAWCS_QuartzJob/Service/IRouterService.cs` | 接口新增方法签名,去掉多余 `public` | --- ## 四、缓存键汇总 | 键 | 用途 | |----|------| | `Router:AllRouters:In` | 入口类型全量路由 | | `Router:AllRouters:Out` | 出口类型全量路由 | | `System:DevicePositions:{deviceCode}` | `QueryAllPositions` 已有缓存,不在本方案范围内 |