整体调整了功能

This commit is contained in:
2026-01-13 15:03:02 +08:00
parent 63a768bd80
commit f1a892281b
82 changed files with 11226 additions and 291 deletions

View File

@@ -89,6 +89,42 @@ namespace FATrace.OEMApp
private void LogWarn(string msg) => AppendLog("WARN", msg, Color.DarkOrange);
private void LogError(string msg) => AppendLog("ERROR", msg, Color.DarkRed);
private void BtnNavMain_Click(object? sender, EventArgs e)
{
materialTabControl1.SelectedIndex = 0;
UpdateNavButtonStyles(0);
}
private void BtnNavHistory_Click(object? sender, EventArgs e)
{
materialTabControl1.SelectedIndex = 1;
UpdateNavButtonStyles(1);
}
private void BtnNavSettings_Click(object? sender, EventArgs e)
{
materialTabControl1.SelectedIndex = 2;
UpdateNavButtonStyles(2);
}
private void UpdateNavButtonStyles(int selectedIndex)
{
var buttons = new[] { btnNavMain, btnNavHistory, btnNavSettings };
for (int i = 0; i < buttons.Length; i++)
{
if (i == selectedIndex)
{
buttons[i].BackColor = Color.FromArgb(63, 81, 181);
buttons[i].ForeColor = Color.White;
}
else
{
buttons[i].BackColor = Color.FromArgb(240, 240, 240);
buttons[i].ForeColor = Color.FromArgb(64, 64, 64);
}
}
}
public MainApp()
{
InitializeComponent();
@@ -100,7 +136,11 @@ namespace FATrace.OEMApp
private PLCDataService PLCDataService { get; set; }
private TimeClearDataService TimeClearService { get; set; }
private System.Windows.Forms.Timer _statusTimer;
/// <summary>
/// TouchSocket Server
/// </summary>
private TouchSocketServer TouchSocketServer { get; set; }
/// <summary>
/// 主窗体加载:
@@ -109,7 +149,7 @@ namespace FATrace.OEMApp
/// - 启动后台任务服务(顺序下载队列 + Jellyfin 批量监听)
/// - 初始化并启动 gridRULogDataGridView定时刷新实时展示下载/监听任务状态
/// </summary>
private void MainApp_Load(object sender, EventArgs e)
private async void MainApp_Load(object sender, EventArgs e)
{
InitLvLog();
LogInfo("主界面初始化");
@@ -129,12 +169,32 @@ namespace FATrace.OEMApp
//HkCameraClient.NVR_Port = ConfigHelper.GetValue("NVRPort");
//HkCameraClient.NVR_UserName = ConfigHelper.GetValue("NVRUserName");
PLCDataService = new PLCDataService();
PLCDataService.PlcConnectedEventHandler += PLCDataService_PlcConnectedEventHandler;
PLCDataService.ScanCodeEventHandler += PLCDataService_ScanCodeEventHandler;
//PLC时间读取
//PLCDataService = new PLCDataService();
//PLCDataService.PlcConnectedEventHandler += PLCDataService_PlcConnectedEventHandler;
//PLCDataService.ScanCodeEventHandler += PLCDataService_ScanCodeEventHandler;
HkCameraClient.NVRVideoSavePath = ConfigHelper.GetValue("NVRVideoSavePath");
var TcpServerIp = ConfigHelper.GetValue("TcpServerIp");
var TcpServerPort = int.Parse(ConfigHelper.GetValue("TcpServerPort"));
TouchSocketServer = new TouchSocketServer(TcpServerIp, TcpServerPort, 30000, 30000);
TouchSocketServer.ClientConnected += TouchSocketServer_ClientConnected;
TouchSocketServer.ClientDisconnected += TouchSocketServer_ClientDisconnected;
TouchSocketServer.DataReceived += TouchSocketServer_DataReceived;
TouchSocketServer.ServerError += TouchSocketServer_ServerError;
var serverStarted = await TouchSocketServer.StartAsync();
if (serverStarted)
{
LogInfo($"TouchSocket Server 已启动,监听 {TcpServerIp}:{TcpServerPort}");
}
else
{
LogError($"TouchSocket Server 启动失败,监听 {TcpServerIp}:{TcpServerPort}");
}
//NVR登录
NVRLogin();
@@ -175,11 +235,11 @@ namespace FATrace.OEMApp
_ = UpdateNasStatusAsync();
_ = UpdateNvrStatusAsync();
StartStatusTimer();
try
{
var systemName = Program.SystemName;
var authText = Program.IsActive ? "(已授权)" : "(未授权)";
var authText = Program.IsActive ? "(添加剂追溯系统)" : "(OEM)";
this.Text = string.IsNullOrWhiteSpace(systemName)
? $"添加剂追溯系统 {authText}"
: $"{systemName} {authText}";
@@ -213,7 +273,7 @@ namespace FATrace.OEMApp
BeginInvoke(new Action(() =>
{
txtRUInBagCode.Text = CurParsedCodeInfo.Code;
txtRURawName.Text= CurParsedCodeInfo.RawName;
txtRURawName.Text = CurParsedCodeInfo.RawName;
txtRURawCode.Text = CurParsedCodeInfo.RawCode;
}));
@@ -573,7 +633,7 @@ namespace FATrace.OEMApp
foreach (DataGridViewColumn col in dataGridView1.Columns)
{
var propName = col.DataPropertyName;
// 设置列头中文
if (!string.IsNullOrWhiteSpace(propName) && _historyHeaderMap.TryGetValue(propName, out var headerText))
{
@@ -645,10 +705,8 @@ namespace FATrace.OEMApp
dataGridView1.AllowUserToAddRows = false;
}
#endregion
/// <summary>
/// 测试/结束操作按钮:同样仅入队一条下载任务,方便快速验证下载->监听全流程。
/// </summary>
@@ -656,8 +714,8 @@ namespace FATrace.OEMApp
/// <param name="e"></param>
private void btnTestAction_Click(object sender, EventArgs e)
{
if (CurParsedCodeInfo==null) return ;
if (CurParsedCodeInfo == null) return;
var taskId = DownloadTaskWorker.Instance.Enqueue(
CurParsedCodeInfo,
user: CurUserName,
@@ -1065,7 +1123,7 @@ namespace FATrace.OEMApp
HkCameraClient.Sdk_NET_DVR_StopGetFile();
}
protected override void OnFormClosing(FormClosingEventArgs e)
protected async override void OnFormClosing(FormClosingEventArgs e)
{
try { DownloadTaskWorker.Instance.DownloadFileNameChanged -= OnDownloadFileNameChanged; } catch { }
try { DownloadTaskWorker.Instance.TaskStarted -= OnTaskStatusChanged; } catch { }
@@ -1073,6 +1131,18 @@ namespace FATrace.OEMApp
try { DownloadTaskWorker.Instance.TaskFailed -= OnTaskFailed; } catch { }
try { _statusTimer?.Stop(); _statusTimer?.Dispose(); _statusTimer = null; } catch { }
try { TimeClearService?.Stop(); } catch { }
try
{
if (TouchSocketServer != null && TouchSocketServer.IsRunning)
{
await TouchSocketServer.StopAsync();
LogInfo("TouchSocket Server 已停止");
}
}
catch (Exception ex)
{
LogError($"TouchSocket Server 停止失败: {ex.Message}");
}
base.OnFormClosing(e);
}
@@ -1098,6 +1168,68 @@ namespace FATrace.OEMApp
catch { }
}
private void TouchSocketServer_ClientConnected(object? sender, TouchSocketServer.ClientConnectedEventArgs e)
{
LogInfo($"[TCP] 客户端连接: {e.ClientId} {e.RemoteIp}:{e.RemotePort}");
}
private void TouchSocketServer_ClientDisconnected(object? sender, TouchSocketServer.ClientDisconnectedEventArgs e)
{
LogInfo($"[TCP] 客户端断开: {e.ClientId} {e.RemoteIp}:{e.RemotePort} 原因={e.Reason}");
}
private void TouchSocketServer_DataReceived(object? sender, TouchSocketServer.DataReceivedEventArgs e)
{
Console.WriteLine($"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} : - IP : {e.RemoteIp} {e.Data}");
// 解析二维码为 QRModel
try
{
if (!string.IsNullOrWhiteSpace(e.Data))
{
//解析Code条码数据内包条码数据
CurParsedCodeInfo = NVRCom.ParseCodeFull(e.Data!.Trim());
BeginInvoke(new Action(() =>
{
txtRUInBagCode.Text = CurParsedCodeInfo.Code;
txtRURawCode.Text = CurParsedCodeInfo.RawCode;
}));
try
{
if (CurParsedCodeInfo == null) return;
var taskId = DownloadTaskWorker.Instance.Enqueue(
CurParsedCodeInfo,
user: CurUserName,
start: DateTime.Now,
end: DateTime.Now
);
}
catch
{
return;
}
}
}
catch (Exception ex)
{
// 解析失败仅记录错误,不影响后续逻辑
LogError($"[TCP] QR 解析失败: {ex.Message}");
}
TouchSocketServer.SendToClient(e.ClientId, "OK");
}
private void TouchSocketServer_ServerError(object? sender, Exception ex)
{
LogError($"[TCP] 服务器错误: {ex.Message}");
}
#region PLC/DB/NAS/NVR
private void StartStatusTimer()
{