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
问题:BaseDal.AddData 和 _cacheService.AddOrUpdate 之间无保护。如果 AddOrUpdate 抛异常,DB 已写入但缓存未更新,下次查询读到旧数据。
修复:使用 try-finally 逻辑,保证 DB 写入后再更新缓存。如果缓存更新失败,下次查询会从 DB 自动重建缓存(GetOrAdd 懒加载保证)。
问题:catch 块仅有注释,无实际日志记录。异常被静默吞掉,调用方无法区分"没有数据"和"查询失败"。
修复:增加 ConsoleHelper.WriteErrorLine 记录错误。
问题:IRouterService 中的方法签名有多余的 public 修饰符。
修复:移除接口方法上的 public 修饰符。
清除 Router:AllRouters:In 和 Router:AllRouters:Out 两个缓存键。
签名:void ClearRouterCache()
实现:csharp _cacheService.Remove("Router:AllRouters:In"); _cacheService.Remove("Router:AllRouters:Out");
查询经过指定设备的所有路由(合并入口/出口类型)。
签名:List<Dt_Router> QueryRoutersByDeviceCode(string deviceCode)
逻辑:从缓存加载 In + Out 路由,筛选 ChildPosiDeviceCode == deviceCode 的路由。
缓存:不独占缓存,直接使用现有 GetAllRoutersFromCache 获取数据。
判断两点之间是否存在路由。
签名:
- bool ExistsRouter(string startPosi, string endPosi) — 全类型
- bool ExistsRouter(string startPosi, string endPosi, int routeType) — 指定类型
逻辑:调用 FindRoutesInMemory,返回 routers.Count > 0。
返回路由数量。
签名:
- int GetRouterCount() — 合并 In + Out 总数
- int GetRouterCount(int routeType) — 指定类型数量
实现:从缓存获取后 .Count。
批量删除指定 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 已有缓存,不在本方案范围内 |