编辑 | blame | 历史 | 原始文档

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:InRouter:AllRouters:Out 两个缓存键。

签名void ClearRouterCache()
实现
csharp _cacheService.Remove("Router:AllRouters:In"); _cacheService.Remove("Router:AllRouters:Out");

2.2 QueryRoutersByDeviceCode(string deviceCode)

查询经过指定设备的所有路由(合并入口/出口类型)。

签名List<Dt_Router> 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<long> 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 已有缓存,不在本方案范围内