利用Cursor编写工业WebScad-005创建历史查询界面
本次实现目的
实现设备故障、设备运行,通讯故障,控制操作、日月年报表的查询
1.初始提示词
下面这段可以直接复制给 **Claude Code**: ```text 你现在是我的 C# / .NET 8 / Blazor Server 工业 WebSCADA 高级架构工程师。 当前项目是现有 IndustrialWebScada 系统。 注意: 1. 不允许新建项目 2. 不允许推翻现有架构 3. 不允许修改现有 PLC / MQTT / SignalR 实时通讯逻辑 4. 不允许破坏现有实时数据页面 5. 只允许新增历史查询、事件记录、报表查询功能 6. 必须基于现有项目代码修改 7. Razor 页面不要写大量业务逻辑 8. 业务逻辑放到 Service / ViewModel 9. 每次最多修改 5 个文件 10. 修改前先分析项目结构 11. 修改后说明测试方法 ================================================== 一、本次目标 ================================================== 我要新增一个“历史查询与报表中心”。 页面建议路由: /history /history/faults /history/communication /history/pump-runs /history/operations /reports/daily /reports/monthly /reports/yearly 也可以根据现有菜单结构调整。 最终实现以下功能: 1. 查询所有设备故障记录 2. 查询所有设备通讯故障记录 3. 查询泵运行 / 停止记录 4. 查询所有用户操作记录 5. 生成日报表、月报表、年报表 ================================================== 二、设备故障历史查询 ================================================== 需要查询所有泵设备故障。 故障来源点位: PUMP1_FAULT PUMP1_VFD_FAULT PUMP2_FAULT PUMP2_VFD_FAULT PUMP3_FAULT PUMP3_VFD_FAULT PUMP4_FAULT PUMP4_VFD_FAULT 故障记录分两类显示: A. 故障发生记录 需要显示: 1. 故障发生时间 2. 泵站名称 3. 泵站编号 4. 几号泵 5. 故障类型 - 泵故障 - 变频故障 6. 故障点位名称 7. 故障值 8. 当前状态 示例: 2026-05-14 10:20:15 1#泵站 1#泵 变频故障 PUMP1_VFD_FAULT 发生 B. 故障恢复记录 需要显示: 1. 故障恢复时间 2. 泵站名称 3. 泵站编号 4. 几号泵 5. 故障类型 6. 故障点位名称 7. 恢复值 8. 当前状态 示例: 2026-05-14 10:35:20 1#泵站 1#泵 变频故障 PUMP1_VFD_FAULT 恢复 要求: 1. 需要根据点位值变化判断事件 2. false -> true 记录故障发生 3. true -> false 记录故障恢复 4. 不要重复插入相同状态记录 5. 页面支持按时间范围查询 6. 页面支持按泵站筛选 7. 页面支持按泵号筛选 8. 页面支持按故障类型筛选 ================================================== 三、通讯故障历史查询 ================================================== 需要查询所有设备通讯故障。 通讯状态来源: 优先使用现有设备在线状态、采集状态、PLC连接状态或实时缓存中的 IsOnline / CommunicationStatus 字段。 如果现有字段名称不同,请先列出当前项目中的字段,不要擅自改名。 通讯故障记录需要显示: 1. 通讯正常时间 2. 通讯故障发生时间 3. 通讯故障恢复时间 4. 泵站名称 5. 泵站编号 6. 通讯状态 7. 故障持续时间 8. 最后一次正常数据时间 9. 恢复后第一次正常数据时间 状态变化规则: 1. true -> false:记录通讯故障发生 2. false -> true:记录通讯故障恢复 3. 不允许重复插入相同状态 4. 通讯故障需要计算持续时间 页面字段: | 时间 | 泵站 | 通讯状态 | 故障发生时间 | 恢复时间 | 持续时间 | ================================================== 四、泵运行 / 停止历史查询 ================================================== 需要查询每台泵什么时候运行,什么时候停止。 运行状态点位: PUMP1_VFD_RUNNING PUMP2_VFD_RUNNING PUMP3_VFD_RUNNING PUMP4_VFD_RUNNING 记录规则: 1. false -> true:记录泵启动 / 运行开始 2. true -> false:记录泵停止 / 运行结束 3. 需要记录运行持续时间 4. 不允许重复记录相同状态 运行记录字段: 1. 泵站名称 2. 泵站编号 3. 泵号 4. 运行开始时间 5. 停止时间 6. 运行时长 7. 状态 8. 关联点位名称 示例: 1#泵站 1#泵 开始运行:2026-05-14 08:00:00 停止时间:2026-05-14 09:30:00 运行时长:1小时30分钟 页面支持: 1. 按时间范围查询 2. 按泵站查询 3. 按泵号查询 4. 按运行状态查询 5. 导出 Excel,预留即可 ================================================== 五、用户操作历史查询 ================================================== 需要查询所有用户操作。 操作来源: 所有控制按钮、参数修改、启动、停止、清零、模式切换、液位设定、频率给定等操作。 每次操作必须记录日志。 操作记录字段: 1. 操作时间 2. 用户名 3. 用户ID 4. 泵站名称 5. 泵站编号 6. 操作对象 7. 操作类型 8. 操作点位 9. 操作前值 10. 操作后值 11. 操作结果 12. 失败原因 13. 客户端IP,可选 操作类型包括: 1. 启动泵 2. 停止泵 3. 累计运行时间清零 4. 控制模式切换 5. 频率给定修改 6. 启泵液位修改 7. 停泵液位修改 8. 延时启动时间修改 9. 其他参数修改 要求: 1. 所有操作必须统一走 IPumpStationCommandService 2. 不允许页面直接写 PLC 3. 写入前弹出二次确认 4. 写入成功记录成功日志 5. 写入失败记录失败日志 6. 页面支持按时间、用户、泵站、操作类型查询 ================================================== 六、日报表 ================================================== 新增日报表生成页面。 用户可以选择: 1. 泵站 2. 日期 3. 统计间隔 统计间隔示例: 1小时 2小时 4小时 6小时 日报表要求: 用户选择某一天和间隔后,生成该天的数据。 例如用户选择: 日期:2026-05-14 间隔:1小时 则生成: 00:00 01:00 02:00 03:00 ... 23:00 每隔 1 小时一条记录。 日报表每条记录包括: 1. 时间 2. 水位 WATER_LEVE 3. 1#泵状态 4. 2#泵状态 5. 3#泵状态 6. 4#泵状态 泵状态显示规则: 如果 PUMPx_FAULT = true 或 PUMPx_VFD_FAULT = true 显示:故障 否则如果 PUMPx_VFD_RUNNING = true 显示:运行 否则 显示:停止 日报表还需要统计: 1. 当天最高水位 2. 最高水位发生时间 3. 当天最低水位 4. 最低水位发生时间 5. 当天平均水位 6. 当天每台泵运行总时长 7. 当天每台泵故障次数,可选 ================================================== 七、月报表 ================================================== 新增月报表生成页面。 用户选择: 1. 泵站 2. 年月 例如: 2026年05月 月报表按天统计。 每条记录为一天: 1. 日期 2. 当天平均液位 3. 当天最高液位 4. 最高液位发生时间 5. 当天最低液位 6. 最低液位发生时间 7. 1#泵当天运行时长 8. 2#泵当天运行时长 9. 3#泵当天运行时长 10. 4#泵当天运行时长 11. 当天故障次数 月报表汇总: 1. 本月平均液位 2. 本月最高液位 3. 本月最高液位发生日期和时间 4. 本月最低液位 5. 本月最低液位发生日期和时间 6. 本月总运行时长 7. 本月故障总次数 ================================================== 八、年报表 ================================================== 新增年报表生成页面。 用户选择: 1. 泵站 2. 年份 例如: 2026年 年报表按月统计。 每条记录为一个月: 1. 月份 2. 当月平均液位 3. 当月最高液位 4. 最高液位发生日期和时间 5. 当月最低液位 6. 最低液位发生日期和时间 7. 1#泵当月运行总时长 8. 2#泵当月运行总时长 9. 3#泵当月运行总时长 10. 4#泵当月运行总时长 11. 当月故障次数 年报表汇总: 1. 本年平均液位 2. 本年最高液位 3. 本年最高液位发生日期和时间 4. 本年最低液位 5. 本年最低液位发生日期和时间 6. 本年总运行时长 7. 本年故障总次数 ================================================== 九、数据表设计建议 ================================================== 如果当前项目已有历史数据表,请优先复用。 如果没有,请新增以下表或实体。 1. FaultEventLog 字段建议: Id StationId StationName PumpNo FaultType PointName EventType Value EventTime RecoverTime DurationSeconds Remark EventType: FaultStart FaultRecover 2. CommunicationEventLog 字段建议: Id StationId StationName EventType NormalTime FaultStartTime FaultRecoverTime DurationSeconds LastNormalDataTime FirstRecoverDataTime Remark 3. PumpRunEventLog 字段建议: Id StationId StationName PumpNo PointName EventType StartTime StopTime DurationSeconds Remark EventType: RunStart RunStop 4. OperationLog 字段建议: Id OperateTime UserId UserName StationId StationName TargetName OperationType PointName OldValue NewValue Result ErrorMessage ClientIp 5. RealtimeSnapshotHistory 用于报表统计。 字段建议: Id StationId StationName CollectTime WaterLevel Pump1Status Pump2Status Pump3Status Pump4Status Pump1Running Pump2Running Pump3Running Pump4Running Pump1Fault Pump2Fault Pump3Fault Pump4Fault ================================================== 十、历史快照记录要求 ================================================== 为了支持日报、月报、年报,需要保存实时快照。 要求: 1. 定时保存实时数据快照 2. 默认每 1 分钟保存一次 3. 保存内容包括: - WATER_LEVE - PUMP1_VFD_RUNNING - PUMP2_VFD_RUNNING - PUMP3_VFD_RUNNING - PUMP4_VFD_RUNNING - PUMP1_FAULT - PUMP1_VFD_FAULT - PUMP2_FAULT - PUMP2_VFD_FAULT - PUMP3_FAULT - PUMP3_VFD_FAULT - PUMP4_FAULT - PUMP4_VFD_FAULT 4. 快照保存服务使用 BackgroundService 5. 不影响实时采集性能 6. 保存失败要记录日志,不能影响主程序运行 ================================================== 十一、事件检测服务 ================================================== 新增事件检测服务。 服务名称建议: PumpEventDetectService 功能: 1. 从实时缓存读取当前值 2. 保存上一轮状态 3. 比较当前状态和上一轮状态 4. 检测: - 泵故障发生 - 泵故障恢复 - 通讯故障发生 - 通讯故障恢复 - 泵运行开始 - 泵运行停止 5. 状态变化时写入事件日志 6. 无变化不写入 7. 服务使用 BackgroundService 8. 检测周期建议 1 秒或 2 秒 注意: 必须避免重复插入事件。 ================================================== 十二、页面设计 ================================================== 新增历史查询中心页面。 页面风格: 1. 深色工业风 2. 卡片式查询条件 3. 表格显示结果 4. 支持时间范围筛选 5. 支持泵站筛选 6. 支持泵号筛选 7. 支持操作类型筛选 8. 支持查询按钮 9. 支持重置按钮 10. 预留导出 Excel 按钮 页面包括: 1. 故障历史 2. 通讯历史 3. 泵运行历史 4. 操作日志 5. 日报表 6. 月报表 7. 年报表 ================================================== 十三、代码结构要求 ================================================== 建议新增目录: Models/History Services/History ViewModels/History Components/Pages/History Components/Pages/Reports 建议新增类: FaultEventLog.cs CommunicationEventLog.cs PumpRunEventLog.cs OperationLog.cs RealtimeSnapshotHistory.cs FaultHistoryService.cs CommunicationHistoryService.cs PumpRunHistoryService.cs OperationLogService.cs ReportService.cs PumpEventDetectService.cs RealtimeSnapshotService.cs DailyReportViewModel.cs MonthlyReportViewModel.cs YearlyReportViewModel.cs HistoryCenter.razor FaultHistory.razor CommunicationHistory.razor PumpRunHistory.razor OperationHistory.razor DailyReport.razor MonthlyReport.razor YearlyReport.razor ================================================== 十四、报表计算规则 ================================================== 日报: 按用户选择的间隔,从 RealtimeSnapshotHistory 中取最接近该时间点的数据。 月报: 按天分组统计: Average(WaterLevel) Max(WaterLevel) Min(WaterLevel) 年报: 按月分组统计: Average(WaterLevel) Max(WaterLevel) Min(WaterLevel) 泵运行时长: 优先从 PumpRunEventLog 计算。 如果事件日志不完整,可以从快照中的 Running 状态估算。 故障次数: 从 FaultEventLog 中统计 FaultStart 数量。 ================================================== 十五、执行步骤 ================================================== 请严格按阶段执行。 第一阶段: 1. 分析当前项目结构 2. 找到数据库上下文 3. 找到实时缓存服务 4. 找到设备在线状态字段 5. 找到现有用户认证信息来源 6. 输出需要新增和修改的文件清单 7. 暂时不要写代码 第二阶段: 1. 新增历史事件实体 2. 新增报表快照实体 3. 修改 DbContext 4. 生成迁移或说明建表 SQL 5. 保证项目可编译 第三阶段: 1. 新增 PumpEventDetectService 2. 实现故障事件检测 3. 实现通讯故障检测 4. 实现泵运行停止检测 5. 避免重复插入事件 第四阶段: 1. 新增 RealtimeSnapshotService 2. 每分钟保存一次实时快照 3. 用于日报、月报、年报统计 第五阶段: 1. 新增历史查询 Service 2. 新增报表 Service 3. 支持按时间、泵站、泵号查询 4. 支持日报、月报、年报生成 第六阶段: 1. 新增历史查询页面 2. 新增报表页面 3. 加入菜单入口 4. 页面使用深色工业风 5. 表格清晰展示数据 第七阶段: 1. 接入操作日志 2. 所有控制命令写入 OperationLog 3. 写入成功和失败都必须记录 ================================================== 十六、特别注意 ================================================== 如果当前项目中字段名和我提供的不一致: 请先列出来,不要擅自修改。 如果当前项目中没有数据库: 请给出 SQLite / SQL Server 两种建表方案。 如果当前项目中已有历史表: 请优先复用,不要重复造表。 如果当前项目没有用户系统: OperationLog 中 UserName 暂时使用当前登录名或 “System”。 如果当前项目没有导出功能: 导出 Excel 先预留按钮,不必第一阶段实现。 ================================================== 十七、最终交付 ================================================== 最终我要得到: 1. 故障历史查询 2. 通讯故障历史查询 3. 泵运行停止历史查询 4. 用户操作历史查询 5. 日报表 6. 月报表 7. 年报表 8. 实时快照保存 9. 事件变化检测 10. 不影响现有实时监控功能 请先分析项目结构,输出修改计划,不要立刻大规模写代码。 ```
2.涉及修改的内容
一、新增文件
1. Modbus 写入通道(控制功能)
- Core/Drivers/IDeviceDriverRegistry.cs — 驱动注册表接口
- Application/DeviceDriverRegistry.cs — 驱动注册表实现(ConcurrentDictionary)
- Application/ModbusPumpStationCommandService.cs — 替代 Stub,实现真正的 PLC 写入
- Drivers/Modbus/ModbusTcpDriver.cs — 实现 WriteAsync(FC05/FC06/FC16)
2. 数据模型扩展(6个新 Model)
- OperationLog.cs — 操作日志
- CommunicationEventLog.cs — 通讯事件
- FaultEventLog.cs — 故障事件
- PumpRunEventLog.cs — 泵运行事件
- RealtimeSnapshotHistory.cs — 实时快照
3. 后台服务(2个新 Service)
- PumpEventDetectService.cs — 泵事件检测
- RealtimeSnapshotService.cs — 实时快照归档
4. 数据层(3个新 Service)
- DatabaseInitializer.cs — 数据库表自动创建
- HistoryQueryService.cs — 历史查询 + 操作日志写入
- ReportService.cs — 报表服务
- Application/HistoryDataService.cs + IHistoryDataService.cs
5. UI 组件(新增)
- PumpControlButtons.razor — 启动/停止/清零按钮 + 确认弹窗
- PumpDeviceCard.razor — 泵设备卡片(替代 PumpStatusIcon)
- PumpStationHeader.razor — 泵站顶部状态栏
- 历史页面: CommunicationHistory / FaultHistory / OperationHistory / PumpRunHistory
- 报表页面: DailyReport / MonthlyReport / YearlyReport
---
二、修改的核心文件
┌──────────────────────────┬────────────────────────────────────────────────────────────────┐
│ 文件 │ 修改内容 │
├──────────────────────────┼────────────────────────────────────────────────────────────────┤
│ IProtocolDriver.cs │ WriteAsync 签名改为接收 TagPoint(非 tagId 字符串) │
├──────────────────────────┼────────────────────────────────────────────────────────────────┤
│ DataCollectionService.cs │ 注入 IDeviceDriverRegistry,驱动创建后注册到 Registry │
├──────────────────────────┼────────────────────────────────────────────────────────────────┤
│ Program.cs │ 注册新服务(Registry、CommandService、后台服务),外部配置加载 │
├──────────────────────────┼────────────────────────────────────────────────────────────────┤
│ PumpStationList.razor │ 重写:增加搜索框、状态筛选按钮、轻量级卡片 │
├──────────────────────────┼────────────────────────────────────────────────────────────────┤
│ PumpStationDetail.razor │ 重写:使用新 PumpDeviceCard,增加参数编辑、液位设定 │
├──────────────────────────┼────────────────────────────────────────────────────────────────┤
│ scada.js │ 新增 positionDialogOnCard() 对话框定位函数 │
├──────────────────────────┼────────────────────────────────────────────────────────────────┤
│ app.css │ 新增泵卡片、确认弹窗、历史/报表页面样式 │
└──────────────────────────┴────────────────────────────────────────────────────────────────┘
---
三、删除的文件
GitHub 版本有但本地删除的:
- .razor.css 样式文件(7个)— 样式合并到 app.css
---
四、架构变化
GitHub 版本(写入链路断开):
UI → StubPumpStationCommandService(仅记日志)
本地版本(完整写入链路):
UI → ModbusPumpStationCommandService
→ IDeviceDriverRegistry → ModbusTcpDriver.WriteAsync
→ FC05 (线圈) / FC06 (寄存器) / FC16 (多寄存器) → PLC
3.最终效果












浙公网安备 33010602011771号