Files

325 lines
12 KiB
C#
Raw Permalink Normal View History

2026-06-14 11:19:15 +08:00
using System;
using System.Collections.Generic;
2026-06-14 11:19:15 +08:00
using System.Drawing;
using System.Linq;
using CycleGUI;
using StandardScene.Utils;
2026-06-14 11:19:15 +08:00
namespace StandardScene.Charge
{
/// <summary>
/// 报警配置管理界面(CycleGUI 版,替代原 WinForms 窗体)。
2026-06-14 11:19:15 +08:00
/// </summary>
public class AlarmConfigManagementForm
2026-06-14 11:19:15 +08:00
{
private const string TableId = "alarm-config-list";
2026-06-14 11:19:15 +08:00
private static readonly string[] LevelNames = { "无", "低", "中", "高", "严重" };
private static readonly string[] LevelFilterNames = { "全部", "无", "低", "中", "高", "严重" };
2026-06-14 11:19:15 +08:00
private static readonly Color CriticalRowColor = Color.FromArgb(255, 235, 238);
private static readonly Color HighRowColor = Color.FromArgb(255, 243, 224);
private static readonly Color MediumRowColor = Color.FromArgb(255, 249, 196);
private static readonly Color LowRowColor = Color.FromArgb(232, 245, 233);
private static readonly Color DisabledRowColor = Color.FromArgb(238, 238, 238);
2026-06-14 11:19:15 +08:00
private static readonly AlarmConfigDataService DataService = AlarmConfigDataService.Instance;
2026-06-14 11:19:15 +08:00
private static Panel _panel;
private static Panel _dialog;
private static List<AlarmConfig> _allAlarms = new List<AlarmConfig>();
private static int _levelFilterIdx;
private static string _status = "";
2026-06-14 11:19:15 +08:00
/// <summary>打开(或置前)报警配置管理面板。兼容原 <c>new AlarmConfigManagementForm().Show()</c> 调用方式。</summary>
public void Show() => Open();
2026-06-14 11:19:15 +08:00
/// <summary>打开(或置前)报警配置管理面板。</summary>
public static void Open()
2026-06-14 11:19:15 +08:00
{
if (_panel != null)
2026-06-14 11:19:15 +08:00
{
try
2026-06-14 11:19:15 +08:00
{
_panel.BringToFront();
return;
2026-06-14 11:19:15 +08:00
}
catch
2026-06-14 11:19:15 +08:00
{
_panel = null;
2026-06-14 11:19:15 +08:00
}
}
2026-06-14 11:19:15 +08:00
LoadAlarms();
2026-06-14 11:19:15 +08:00
var panel = GUI.DeclarePanel()
.ShowTitle("报警配置管理")
.SetDefaultDocking(Panel.Docking.None)
.InitSize(1100, 680)
.InitPos(false, 0, 0, 0.5f, 0.5f, 0.5f, 0.5f);
_panel = panel;
panel.IfTerminalQuit(() => _panel = null);
2026-06-14 11:19:15 +08:00
panel.Define(pb =>
2026-06-14 11:19:15 +08:00
{
if (pb.Closing())
2026-06-14 11:19:15 +08:00
{
panel.Exit();
_panel = null;
2026-06-14 11:19:15 +08:00
return;
}
if (pb.Button("新增", distinct: "alarm-add"))
OpenEditDialog(null);
pb.SameLine(12);
if (pb.Button("刷新", distinct: "alarm-refresh"))
2026-06-14 11:19:15 +08:00
{
DataService.Reload();
LoadAlarms();
_status = "数据已刷新";
2026-06-14 11:19:15 +08:00
}
pb.SameLine(12);
if (pb.Button("关闭", distinct: "alarm-close"))
2026-06-14 11:19:15 +08:00
{
panel.Exit();
_panel = null;
return;
2026-06-14 11:19:15 +08:00
}
pb.Separator();
pb.DropdownBox("级别筛选", LevelFilterNames, ref _levelFilterIdx);
var filtered = GetFilteredAlarms();
var totalCount = _allAlarms.Count;
if (_levelFilterIdx > 0)
pb.Label($"显示: {filtered.Count}/{totalCount} ({LevelFilterNames[_levelFilterIdx]})");
2026-06-14 11:19:15 +08:00
else
pb.Label($"总数: {totalCount} | {GetStatisticsText()}");
2026-06-14 11:19:15 +08:00
pb.Table(TableId,
new[] { "报警编码", "报警内容", "级别", "启用", "备注", "操作" },
filtered.Count, (row, i) =>
{
var alarm = filtered[i];
if (!alarm.Enabled)
row.SetColor(DisabledRowColor);
else if (alarm.Level == AlarmLevel.Critical)
row.SetColor(CriticalRowColor);
else if (alarm.Level == AlarmLevel.High)
row.SetColor(HighRowColor);
else if (alarm.Level == AlarmLevel.Medium)
row.SetColor(MediumRowColor);
else if (alarm.Level == AlarmLevel.Low)
row.SetColor(LowRowColor);
row.Label($"{alarm.AlarmCode}");
row.Label(alarm.AlarmContent ?? "");
row.Label(GetLevelText(alarm.Level));
row.Label(alarm.Enabled ? "是" : "否");
row.Label(alarm.Remarks ?? "");
if (row.ButtonGroup(new[] { "编辑" }, new[] { "编辑该报警配置" }) == 0)
OpenEditDialog(alarm);
}, height: 16, enableSearch: true);
if (!string.IsNullOrEmpty(_status))
{
pb.Separator();
pb.Label(_status);
}
pb.Panel.Repaint(repaintTimeMs: 500);
});
2026-06-14 11:19:15 +08:00
}
private static void OpenEditDialog(AlarmConfig existing)
2026-06-14 11:19:15 +08:00
{
if (_dialog != null)
2026-06-14 11:19:15 +08:00
{
try
2026-06-14 11:19:15 +08:00
{
_dialog.BringToFront();
return;
2026-06-14 11:19:15 +08:00
}
catch
2026-06-14 11:19:15 +08:00
{
_dialog = null;
2026-06-14 11:19:15 +08:00
}
}
2026-06-14 11:19:15 +08:00
bool isAdd = existing == null;
var draft = isAdd ? new AlarmConfig() : existing;
2026-06-14 11:19:15 +08:00
int levelIdx = (int)draft.Level;
if (levelIdx < 0 || levelIdx >= LevelNames.Length)
levelIdx = 2;
2026-06-14 11:19:15 +08:00
string codeText = draft.AlarmCode.ToString();
string contentText = draft.AlarmContent ?? "";
string remarksText = draft.Remarks ?? "";
bool enabled = draft.Enabled;
string err = "";
2026-06-14 11:19:15 +08:00
var dlg = GUI.DeclarePanel()
.ShowTitle(isAdd ? "新增报警配置" : $"编辑报警配置 [{draft.AlarmCode}]")
.SetDefaultDocking(Panel.Docking.None)
.InitSize(460, 420)
.InitPos(false, 0, 0, 0.5f, 0.5f, 0.5f, 0.5f);
_dialog = dlg;
dlg.IfTerminalQuit(() => _dialog = null);
2026-06-14 11:19:15 +08:00
dlg.Define(pb =>
{
if (pb.Closing())
2026-06-14 11:19:15 +08:00
{
dlg.Exit();
_dialog = null;
return;
2026-06-14 11:19:15 +08:00
}
if (isAdd)
pb.Label("编号: (新增时自动生成)");
else
pb.Label($"编号: {draft.AlarmId}");
2026-06-14 11:19:15 +08:00
var (code, _) = pb.TextInput("1. 报警编码 (0~99999)", codeText, alwaysReturnString: true);
codeText = code;
var (content, _) = pb.TextInput("2. 报警内容", contentText, alwaysReturnString: true);
contentText = content;
pb.DropdownBox("3. 报警级别", LevelNames, ref levelIdx);
pb.CheckBox("4. 启用", ref enabled);
var (remarks, _) = pb.TextInput("5. 备注", remarksText, alwaysReturnString: true);
remarksText = remarks;
2026-06-14 11:19:15 +08:00
if (!string.IsNullOrEmpty(err))
2026-06-14 11:19:15 +08:00
{
pb.Separator();
pb.Label(err);
2026-06-14 11:19:15 +08:00
}
pb.Separator();
if (pb.Button(isAdd ? "新增" : "保存", distinct: "alarm-edit-save"))
2026-06-14 11:19:15 +08:00
{
if (!int.TryParse(codeText?.Trim(), out var alarmCode) || alarmCode < 0 || alarmCode > 99999)
{
err = "报警编码需为 0~99999 的整数";
return;
}
2026-06-14 11:19:15 +08:00
if (string.IsNullOrWhiteSpace(contentText))
{
err = "报警内容不能为空";
return;
}
2026-06-14 11:19:15 +08:00
draft.AlarmCode = alarmCode;
draft.AlarmContent = contentText.Trim();
draft.Level = (AlarmLevel)levelIdx;
draft.Enabled = enabled;
draft.Remarks = remarksText?.Trim() ?? "";
2026-06-14 11:19:15 +08:00
bool success;
string errorMessage;
if (isAdd)
success = DataService.AddAlarmConfig(draft, out errorMessage);
else
success = DataService.UpdateAlarmConfig(draft, out errorMessage);
2026-06-14 11:19:15 +08:00
if (success)
{
CycleUiHelper.Alert("成功", "保存成功!");
LoadAlarms();
_status = isAdd ? "已新增报警配置" : $"已保存报警配置 [{draft.AlarmCode}]";
dlg.Exit();
_dialog = null;
_panel?.Repaint();
}
else
{
err = $"保存失败: {errorMessage}";
}
2026-06-14 11:19:15 +08:00
}
if (!isAdd)
2026-06-14 11:19:15 +08:00
{
pb.SameLine(8);
if (pb.Button("删除", distinct: "alarm-edit-delete"))
{
var toDelete = draft;
CycleUiHelper.ConfirmThen(
$"确定要删除报警配置 [{toDelete.AlarmCode}] {toDelete.AlarmContent} 吗?",
() =>
{
if (DataService.DeleteAlarmConfig(toDelete.AlarmId, out string errorMessage))
{
CycleUiHelper.Alert("成功", "删除成功!");
LoadAlarms();
_status = $"已删除报警配置 [{toDelete.AlarmCode}]";
dlg.Exit();
_dialog = null;
_panel?.Repaint();
}
else
{
CycleUiHelper.Alert("错误", $"删除失败: {errorMessage}");
}
});
}
2026-06-14 11:19:15 +08:00
}
pb.SameLine(8);
if (pb.Button("取消", distinct: "alarm-edit-cancel"))
2026-06-14 11:19:15 +08:00
{
dlg.Exit();
_dialog = null;
2026-06-14 11:19:15 +08:00
}
});
2026-06-14 11:19:15 +08:00
}
private static void LoadAlarms()
2026-06-14 11:19:15 +08:00
{
try
{
_allAlarms = DataService.GetAllAlarmConfigs() ?? new List<AlarmConfig>();
2026-06-14 11:19:15 +08:00
}
catch (Exception ex)
{
_allAlarms = new List<AlarmConfig>();
CycleUiHelper.Alert("错误", $"加载数据失败: {ex.Message}");
2026-06-14 11:19:15 +08:00
}
}
private static List<AlarmConfig> GetFilteredAlarms()
2026-06-14 11:19:15 +08:00
{
IEnumerable<AlarmConfig> query = _allAlarms;
if (_levelFilterIdx > 0)
query = query.Where(a => a.Level == (AlarmLevel)(_levelFilterIdx - 1));
return query.ToList();
2026-06-14 11:19:15 +08:00
}
private static string GetStatisticsText()
2026-06-14 11:19:15 +08:00
{
var total = _allAlarms.Count;
var enabled = _allAlarms.Count(a => a.Enabled);
var disabled = total - enabled;
var critical = _allAlarms.Count(a => a.Level == AlarmLevel.Critical);
var high = _allAlarms.Count(a => a.Level == AlarmLevel.High);
return $"启用: {enabled} | 禁用: {disabled} | 严重: {critical} | 高级: {high}";
2026-06-14 11:19:15 +08:00
}
private static string GetLevelText(AlarmLevel level)
2026-06-14 11:19:15 +08:00
{
switch (level)
2026-06-14 11:19:15 +08:00
{
case AlarmLevel.None: return "无";
case AlarmLevel.Low: return "低";
case AlarmLevel.Medium: return "中";
case AlarmLevel.High: return "高";
case AlarmLevel.Critical: return "严重";
default: return "未知";
2026-06-14 11:19:15 +08:00
}
}
}
}