将 StandardScene 各插件的配置/监控窗体从 WinForms 迁移到 CycleGUI(删除 .Designer.cs/.resx,重写为 PanelBuilder 立即模式 UI,新增 CycleUiHelper 统一对话框)。 同时修复代码审核中的问题: - 后台文件写入加锁 + try/catch(ButtonBoxManager / DoorManager,对齐 LoopViewer.SaveTasks 模式) - CoderFieldsMetadata.cs 启用 #nullable enable,消除 CS8632 警告 - DummyCar 移除已废弃的 rightClickAction()/SetPosition() - CarRemoteHelper.OpenVehicleWebPage 的 Process.Start 加 try/catch - 重命名名不副实的 Mstsc()(现为打开网页) - 统一弃元命名为 _ - TrafficInterlockViewer 改用稳定 Id(GUID)做选择/编辑,替代行索引 - csproj 改用 $(CGUILibDir) 解析 CycleGUI,绝对路径收敛到 Directory.Build.props 构建:dotnet build StandardScene.sln → 0 错误,30 警告(均为历史遗留)。 注:static 单例状态重构(审核第 8 项)暂未处理,留待单独任务。
325 lines
12 KiB
C#
325 lines
12 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Drawing;
|
|
using System.Linq;
|
|
using CycleGUI;
|
|
using StandardScene.Utils;
|
|
|
|
namespace StandardScene.Charge
|
|
{
|
|
/// <summary>
|
|
/// 报警配置管理界面(CycleGUI 版,替代原 WinForms 窗体)。
|
|
/// </summary>
|
|
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<AlarmConfig> _allAlarms = new List<AlarmConfig>();
|
|
private static int _levelFilterIdx;
|
|
private static string _status = "";
|
|
|
|
/// <summary>打开(或置前)报警配置管理面板。兼容原 <c>new AlarmConfigManagementForm().Show()</c> 调用方式。</summary>
|
|
public void Show() => Open();
|
|
|
|
/// <summary>打开(或置前)报警配置管理面板。</summary>
|
|
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<AlarmConfig>();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
_allAlarms = new List<AlarmConfig>();
|
|
CycleUiHelper.Alert("错误", $"加载数据失败: {ex.Message}");
|
|
}
|
|
}
|
|
|
|
private static List<AlarmConfig> GetFilteredAlarms()
|
|
{
|
|
IEnumerable<AlarmConfig> 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 "未知";
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|