推送
This commit is contained in:
@@ -4,12 +4,14 @@ using FATrace.HKNetLib.Wrapper;
|
||||
using FATrace.Model;
|
||||
using FATrace.OEMApp.Services;
|
||||
using FATrace.OEMApp.Model;
|
||||
using System.Diagnostics;
|
||||
using System.Threading.Tasks;
|
||||
using LibVLCSharp.Shared;
|
||||
using NLog;
|
||||
using ReaLTaiizor.Forms;
|
||||
using System.Collections.Concurrent;
|
||||
using System.ComponentModel;
|
||||
using System.Threading;
|
||||
using TaskStatus = FATrace.Model.TaskStatus;
|
||||
|
||||
namespace FATrace.OEMApp
|
||||
@@ -41,6 +43,11 @@ namespace FATrace.OEMApp
|
||||
private int _lvLogMaxItems = 1000;
|
||||
private int _lastProgressLogged = -1;
|
||||
|
||||
/// <summary>
|
||||
/// 关闭确认标记:用于避免重复弹窗(如关闭过程触发多次 OnFormClosing)
|
||||
/// </summary>
|
||||
private bool _closeConfirmed;
|
||||
|
||||
private void InitLvLog()
|
||||
{
|
||||
try
|
||||
@@ -82,7 +89,10 @@ namespace FATrace.OEMApp
|
||||
for (int i = 0; i < 200; i++) { if (LvLog.Items.Count == 0) break; LvLog.Items.RemoveAt(0); }
|
||||
}
|
||||
}
|
||||
catch { }
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogError($"AppendLog: {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
private void LogInfo(string msg) => AppendLog("INFO", msg, Color.FromArgb(33, 33, 33));
|
||||
@@ -134,7 +144,7 @@ namespace FATrace.OEMApp
|
||||
/// PLC数据服务
|
||||
/// </summary>
|
||||
private PLCDataService PLCDataService { get; set; }
|
||||
private TimeClearDataService TimeClearService { get; set; }
|
||||
//private TimeClearDataService TimeClearService { get; set; }
|
||||
private System.Windows.Forms.Timer _statusTimer;
|
||||
|
||||
/// <summary>
|
||||
@@ -162,7 +172,10 @@ namespace FATrace.OEMApp
|
||||
{
|
||||
HkCameraClient.NVRLoadVideoProcessEventHandler += HkCameraClient_NVRLoadVideoProcessEventHandler;
|
||||
}
|
||||
catch { }
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogError($"AppendLog: {ex.Message}");
|
||||
}
|
||||
|
||||
//读取配置
|
||||
//HkCameraClient.NVR_IP = ConfigHelper.GetValue("NVRIP");
|
||||
@@ -198,7 +211,6 @@ namespace FATrace.OEMApp
|
||||
//NVR登录
|
||||
NVRLogin();
|
||||
|
||||
InitMediaPlayer();
|
||||
InitHistoryGridBinding();
|
||||
|
||||
// 启动后台任务服务:下载队列(单线程顺序)与 Jellyfin 批量监控(并行匹配)
|
||||
@@ -212,11 +224,13 @@ namespace FATrace.OEMApp
|
||||
try { DownloadTaskWorker.Instance.TaskFailed += OnTaskFailed; } catch { }
|
||||
// JellyfinMonitorQueueService.Instance.Start();
|
||||
// LogInfo("Jellyfin 监控服务已启动");
|
||||
LogInfo("Jellyfin 监控服务已停用");
|
||||
TimeClearService = new TimeClearDataService();
|
||||
TimeClearService.Info += (m) => LogInfo($"[清理]{m}");
|
||||
TimeClearService.Start();
|
||||
LogInfo("定时清理服务已启动");
|
||||
//LogInfo("Jellyfin 监控服务已停用");
|
||||
|
||||
//TimeClearService = new TimeClearDataService();
|
||||
//TimeClearService.Info += (m) => LogInfo($"[清理]{m}");
|
||||
//TimeClearService.Start();
|
||||
|
||||
//LogInfo("定时清理服务已启动");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
@@ -230,7 +244,7 @@ namespace FATrace.OEMApp
|
||||
RefreshRuLogGrid();
|
||||
|
||||
// 初始化底部连接状态(立即检测一次 + 定时轻量检测)
|
||||
SafeSetStatus(tslPlcConnection, PLCDataService?.PlcConnected == true, "Plc连接状态");
|
||||
//SafeSetStatus(tslPlcConnection, PLCDataService?.PlcConnected == true, "Plc连接状态");
|
||||
_ = UpdateDbStatusAsync();
|
||||
_ = UpdateNasStatusAsync();
|
||||
_ = UpdateNvrStatusAsync();
|
||||
@@ -464,42 +478,41 @@ namespace FATrace.OEMApp
|
||||
|
||||
#region 视频播放
|
||||
|
||||
private LibVLC _libVLC;
|
||||
private MediaPlayer _mediaPlayer;
|
||||
|
||||
/// <summary>
|
||||
/// 初始化MediaPlay
|
||||
/// </summary>
|
||||
private void InitMediaPlayer()
|
||||
private static async Task<bool> FileExistsWithTimeoutAsync(string path, int timeoutMs, CancellationToken cancellationToken)
|
||||
{
|
||||
_libVLC = new LibVLC();
|
||||
_mediaPlayer = new MediaPlayer(_libVLC);
|
||||
videoView1.MediaPlayer = _mediaPlayer;
|
||||
|
||||
var task = Task.Run(() => File.Exists(path), cancellationToken);
|
||||
var done = await Task.WhenAny(task, Task.Delay(timeoutMs, cancellationToken));
|
||||
if (done != task) return false;
|
||||
return await task;
|
||||
}
|
||||
|
||||
private void OpenVideoWithDefaultPlayer(string path)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(path))
|
||||
{
|
||||
throw new ArgumentException("视频路径为空", nameof(path));
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
var psi = new ProcessStartInfo
|
||||
{
|
||||
FileName = path,
|
||||
UseShellExecute = true
|
||||
};
|
||||
Process.Start(psi);
|
||||
LogInfo($"已使用系统播放器打开: {path}");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogError($"系统播放器打开失败: {ex.Message} | {path}");
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#endregion
|
||||
|
||||
/// <summary>
|
||||
/// 停止播放当前的视频文件
|
||||
/// </summary>
|
||||
/// <param name="sender"></param>
|
||||
/// <param name="e"></param>
|
||||
private void btnStopHistoryPlay_Click(object sender, EventArgs e)
|
||||
{
|
||||
_mediaPlayer.Stop();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 清理播放资源
|
||||
/// </summary>
|
||||
private void CleanMediaPlay()
|
||||
{
|
||||
_mediaPlayer.Stop();
|
||||
_mediaPlayer.Dispose();
|
||||
_libVLC.Dispose();
|
||||
}
|
||||
|
||||
|
||||
#region 历史数据查询
|
||||
|
||||
@@ -582,7 +595,7 @@ namespace FATrace.OEMApp
|
||||
/// <summary>
|
||||
/// 双击行,播放该行对应的视频文件
|
||||
/// </summary>
|
||||
private void DataGridView1_CellDoubleClick(object? sender, DataGridViewCellEventArgs e)
|
||||
private async void DataGridView1_CellDoubleClick(object? sender, DataGridViewCellEventArgs e)
|
||||
{
|
||||
if (e.RowIndex < 0) return; // 双击列头等
|
||||
try
|
||||
@@ -596,14 +609,16 @@ namespace FATrace.OEMApp
|
||||
MessageBox.Show("该记录没有可播放的视频路径。", "播放提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
|
||||
return;
|
||||
}
|
||||
if (!File.Exists(path))
|
||||
|
||||
using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(5));
|
||||
var exists = await FileExistsWithTimeoutAsync(path, timeoutMs: 4000, cts.Token);
|
||||
if (!exists)
|
||||
{
|
||||
MessageBox.Show($"未找到视频文件:\n{path}", "播放失败", MessageBoxButtons.OK, MessageBoxIcon.Warning);
|
||||
MessageBox.Show($"未找到视频文件或访问超时(网络盘可能较慢):\n{path}", "播放失败", MessageBoxButtons.OK, MessageBoxIcon.Warning);
|
||||
return;
|
||||
}
|
||||
|
||||
_mediaPlayer?.Stop();
|
||||
_mediaPlayer?.Play(new LibVLCSharp.Shared.Media(_libVLC, path));
|
||||
OpenVideoWithDefaultPlayer(path);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
@@ -673,6 +688,13 @@ namespace FATrace.OEMApp
|
||||
continue;
|
||||
}
|
||||
|
||||
// 隐藏视频路径列(仍保留数据用于双击播放)
|
||||
if (propName == nameof(OEMRawUse.VideoFilePath))
|
||||
{
|
||||
col.Visible = false;
|
||||
continue;
|
||||
}
|
||||
|
||||
// 仅显示指定字段,其他隐藏
|
||||
if (!allowedProps.Contains(propName))
|
||||
{
|
||||
@@ -714,13 +736,29 @@ namespace FATrace.OEMApp
|
||||
/// <param name="e"></param>
|
||||
private void btnTestAction_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (CurParsedCodeInfo == null) return;
|
||||
if (CurParsedCodeInfo == null)
|
||||
{
|
||||
CurParsedCodeInfo = new ParsedCodeInfo()
|
||||
{
|
||||
Batch = "260131",
|
||||
Code = "DYG05030013,250710,8228,12,01,7",
|
||||
Count = 1,
|
||||
RawCode = "DYG05030013",
|
||||
RawName = "",
|
||||
RegionCode = "2",
|
||||
RegionName = "1",
|
||||
ShelfLifeMonths = 12,
|
||||
Weight = (decimal)80.25,
|
||||
};
|
||||
//return;
|
||||
}
|
||||
|
||||
|
||||
var taskId = DownloadTaskWorker.Instance.Enqueue(
|
||||
CurParsedCodeInfo,
|
||||
user: CurUserName,
|
||||
start: DateTime.Now.AddDays(-2),
|
||||
end: DateTime.Now.AddDays(-2).AddSeconds(DownloadTaskWorker.VideoTime)
|
||||
start: DateTime.Now,
|
||||
end: DateTime.Now.AddSeconds(DownloadTaskWorker.VideoTime)
|
||||
);
|
||||
//MessageBox.Show($"[Test] 已入队下载任务,Id={taskId}");
|
||||
}
|
||||
@@ -965,6 +1003,7 @@ namespace FATrace.OEMApp
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogError($"[gridRULog] 刷新失败: {ex.Message}");
|
||||
System.Diagnostics.Debug.WriteLine($"[gridRULog] 刷新失败: {ex.Message}");
|
||||
}
|
||||
}
|
||||
@@ -992,7 +1031,10 @@ namespace FATrace.OEMApp
|
||||
_ = SaveCsvForTaskAsync(t);
|
||||
}
|
||||
}
|
||||
catch { }
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogError($"[OnTaskStatusChanged] 失败: {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
private void OnTaskFailed(DownloadTask t, string? error)
|
||||
@@ -1011,7 +1053,10 @@ namespace FATrace.OEMApp
|
||||
// 失败同样清零进度
|
||||
ResetProgressBar();
|
||||
}
|
||||
catch { }
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogError($"[OnTaskFailed] 失败: {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
private void UpsertRuLogRowFromTask(DownloadTask t)
|
||||
@@ -1098,7 +1143,10 @@ namespace FATrace.OEMApp
|
||||
txtCsvSaveState.ForeColor = ok ? Color.ForestGreen : Color.DarkRed;
|
||||
}
|
||||
}
|
||||
catch { }
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogError($"[SafeSetCsvState] 失败: {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
private static void SetDataGridViewDoubleBuffered(DataGridView dgv)
|
||||
@@ -1123,29 +1171,6 @@ namespace FATrace.OEMApp
|
||||
HkCameraClient.Sdk_NET_DVR_StopGetFile();
|
||||
}
|
||||
|
||||
protected async override void OnFormClosing(FormClosingEventArgs e)
|
||||
{
|
||||
try { DownloadTaskWorker.Instance.DownloadFileNameChanged -= OnDownloadFileNameChanged; } catch { }
|
||||
try { DownloadTaskWorker.Instance.TaskStarted -= OnTaskStatusChanged; } catch { }
|
||||
try { DownloadTaskWorker.Instance.TaskCompleted -= OnTaskStatusChanged; } catch { }
|
||||
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);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 当前下载文件的名称改变
|
||||
/// </summary>
|
||||
@@ -1165,7 +1190,10 @@ namespace FATrace.OEMApp
|
||||
|
||||
}
|
||||
}
|
||||
catch { }
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogError($"OnDownloadFileNameChanged: {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
private void TouchSocketServer_ClientConnected(object? sender, TouchSocketServer.ClientConnectedEventArgs e)
|
||||
@@ -1208,8 +1236,9 @@ namespace FATrace.OEMApp
|
||||
end: DateTime.Now
|
||||
);
|
||||
}
|
||||
catch
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogError($"TouchSocketServer_DataReceived: {ex.Message}");
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -1245,7 +1274,10 @@ namespace FATrace.OEMApp
|
||||
};
|
||||
_statusTimer.Start();
|
||||
}
|
||||
catch { }
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogError($"StartStatusTimer: {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
private void SafeSetStatus(ToolStripStatusLabel lbl, bool ok, string title)
|
||||
@@ -1263,7 +1295,10 @@ namespace FATrace.OEMApp
|
||||
lbl.Text = text; lbl.ForeColor = fore;
|
||||
}
|
||||
}
|
||||
catch { }
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogError($"SafeSetStatus: {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
private async Task UpdateDbStatusAsync()
|
||||
@@ -1306,5 +1341,57 @@ namespace FATrace.OEMApp
|
||||
SafeSetStatus(tslNVRConnection, ok, "NVR连接状态");
|
||||
}
|
||||
#endregion
|
||||
|
||||
private void MainApp_FormClosing(object sender, FormClosingEventArgs e)
|
||||
{
|
||||
if (!_closeConfirmed && e.CloseReason == CloseReason.UserClosing)
|
||||
{
|
||||
try
|
||||
{
|
||||
var result = MessageBox.Show(
|
||||
"确认退出系统?",
|
||||
"退出确认",
|
||||
MessageBoxButtons.YesNo,
|
||||
MessageBoxIcon.Question,
|
||||
MessageBoxDefaultButton.Button2);
|
||||
|
||||
if (result != DialogResult.Yes)
|
||||
{
|
||||
e.Cancel = true;
|
||||
LogInfo("已取消关闭");
|
||||
return;
|
||||
}
|
||||
|
||||
_closeConfirmed = true;
|
||||
LogInfo("用户确认关闭,开始退出");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
// 弹窗异常时,为保证可关闭,默认继续退出,但记录日志
|
||||
LogError($"关闭确认弹窗异常: {ex.Message}");
|
||||
_closeConfirmed = true;
|
||||
}
|
||||
}
|
||||
|
||||
try { DownloadTaskWorker.Instance.DownloadFileNameChanged -= OnDownloadFileNameChanged; } catch { }
|
||||
try { DownloadTaskWorker.Instance.TaskStarted -= OnTaskStatusChanged; } catch { }
|
||||
try { DownloadTaskWorker.Instance.TaskCompleted -= OnTaskStatusChanged; } catch { }
|
||||
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.cl();
|
||||
LogInfo("TouchSocket Server 已停止");
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogError($"TouchSocket Server 停止失败: {ex.Message}");
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user