using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using CycleGUI;
using StandardScene.Utils;
namespace StandardScene.Charge
{
///
/// 报警配置管理界面(CycleGUI 版,替代原 WinForms 窗体)。
///
public class AlarmConfigManagementForm
{
private const string TableId = "alarm-config-list";
private static readonly string[] LevelNames = { "无", "低", "中", "高", "严重" };
private static readonly string[] LevelFilterNames = { "全部", "无", "低", "中", "高", "严重" };
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);
private static readonly AlarmConfigDataService DataService = AlarmConfigDataService.Instance;
private static Panel _panel;
private static Panel _dialog;
private static List _allAlarms = new List();
private static int _levelFilterIdx;
private static string _status = "";
/// 打开(或置前)报警配置管理面板。兼容原 new AlarmConfigManagementForm().Show() 调用方式。
public void Show() => Open();
/// 打开(或置前)报警配置管理面板。
public static void Open()
{
if (_panel != null)
{
try
{
_panel.BringToFront();
return;
}
catch
{
_panel = null;
}
}
LoadAlarms();
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);
panel.Define(pb =>
{
if (pb.Closing())
{
panel.Exit();
_panel = null;
return;
}
if (pb.Button("新增", distinct: "alarm-add"))
OpenEditDialog(null);
pb.SameLine(12);
if (pb.Button("刷新", distinct: "alarm-refresh"))
{
DataService.Reload();
LoadAlarms();
_status = "数据已刷新";
}
pb.SameLine(12);
if (pb.Button("关闭", distinct: "alarm-close"))
{
panel.Exit();
_panel = null;
return;
}
pb.Separator();
pb.DropdownBox("级别筛选", LevelFilterNames, ref _levelFilterIdx);
var filtered = GetFilteredAlarms();
var totalCount = _allAlarms.Count;
if (_levelFilterIdx > 0)
pb.Label($"显示: {filtered.Count}/{totalCount} ({LevelFilterNames[_levelFilterIdx]})");
else
pb.Label($"总数: {totalCount} | {GetStatisticsText()}");
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);
});
}
private static void OpenEditDialog(AlarmConfig existing)
{
if (_dialog != null)
{
try
{
_dialog.BringToFront();
return;
}
catch
{
_dialog = null;
}
}
bool isAdd = existing == null;
var draft = isAdd ? new AlarmConfig() : existing;
int levelIdx = (int)draft.Level;
if (levelIdx < 0 || levelIdx >= LevelNames.Length)
levelIdx = 2;
string codeText = draft.AlarmCode.ToString();
string contentText = draft.AlarmContent ?? "";
string remarksText = draft.Remarks ?? "";
bool enabled = draft.Enabled;
string err = "";
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);
dlg.Define(pb =>
{
if (pb.Closing())
{
dlg.Exit();
_dialog = null;
return;
}
if (isAdd)
pb.Label("编号: (新增时自动生成)");
else
pb.Label($"编号: {draft.AlarmId}");
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;
if (!string.IsNullOrEmpty(err))
{
pb.Separator();
pb.Label(err);
}
pb.Separator();
if (pb.Button(isAdd ? "新增" : "保存", distinct: "alarm-edit-save"))
{
if (!int.TryParse(codeText?.Trim(), out var alarmCode) || alarmCode < 0 || alarmCode > 99999)
{
err = "报警编码需为 0~99999 的整数";
return;
}
if (string.IsNullOrWhiteSpace(contentText))
{
err = "报警内容不能为空";
return;
}
draft.AlarmCode = alarmCode;
draft.AlarmContent = contentText.Trim();
draft.Level = (AlarmLevel)levelIdx;
draft.Enabled = enabled;
draft.Remarks = remarksText?.Trim() ?? "";
bool success;
string errorMessage;
if (isAdd)
success = DataService.AddAlarmConfig(draft, out errorMessage);
else
success = DataService.UpdateAlarmConfig(draft, out errorMessage);
if (success)
{
CycleUiHelper.Alert("成功", "保存成功!");
LoadAlarms();
_status = isAdd ? "已新增报警配置" : $"已保存报警配置 [{draft.AlarmCode}]";
dlg.Exit();
_dialog = null;
_panel?.Repaint();
}
else
{
err = $"保存失败: {errorMessage}";
}
}
if (!isAdd)
{
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}");
}
});
}
}
pb.SameLine(8);
if (pb.Button("取消", distinct: "alarm-edit-cancel"))
{
dlg.Exit();
_dialog = null;
}
});
}
private static void LoadAlarms()
{
try
{
_allAlarms = DataService.GetAllAlarmConfigs() ?? new List();
}
catch (Exception ex)
{
_allAlarms = new List();
CycleUiHelper.Alert("错误", $"加载数据失败: {ex.Message}");
}
}
private static List GetFilteredAlarms()
{
IEnumerable query = _allAlarms;
if (_levelFilterIdx > 0)
query = query.Where(a => a.Level == (AlarmLevel)(_levelFilterIdx - 1));
return query.ToList();
}
private static string GetStatisticsText()
{
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}";
}
private static string GetLevelText(AlarmLevel level)
{
switch (level)
{
case AlarmLevel.None: return "无";
case AlarmLevel.Low: return "低";
case AlarmLevel.Medium: return "中";
case AlarmLevel.High: return "高";
case AlarmLevel.Critical: return "严重";
default: return "未知";
}
}
}
}