using CCDCount.DLL;
using CCDCount.DLL.SqlDataClass;
using CCDCount.MODEL.ConfigModel;
using CCDCount.MODEL.ShuLiModel;
using CCDCountWpf.Language;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Markup;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace CCDCountWpf.WpfPage
{
///
/// HistoryDataPage.xaml 的交互逻辑
///
public partial class HistoryDataPage : Page
{
private static ActionMesSqliteDataClass actionMesSqliteDataClass = null;
List ErrorActive = null;
List NowPageError = null;
int NowErrorNum = 0;
int DataStartLine = 0;
private int PageHeight = 2000;
public HistoryDataPage()
{
InitializeComponent();
DataContext = ShowMessageBus.ShowBinding;
InitBatchItems();
UpDateShowBinding();
}
private void PreviousBtn_Click(object sender, RoutedEventArgs e)
{
if (ShowMessageBus.ShowBinding.HistoryImageNum <= 1)
{
MessageBox.Show("已经是第一页");
return;
}
ShowMessageBus.ShowBinding.HistoryImageNum -= 1;
UpDateShowBinding();
}
private void NextBtn_Click(object sender, RoutedEventArgs e)
{
if (ShowMessageBus.ShowBinding.HistoryImageNum >= ShowMessageBus.ShowBinding.HistoryImageCount)
{
MessageBox.Show("已经是最后一页");
return;
}
ShowMessageBus.ShowBinding.HistoryImageNum += 1;
UpDateShowBinding();
}
private void UpDateShowBinding()
{
if (actionMesSqliteDataClass == null)
{
return;
}
Stopwatch stopwatch = Stopwatch.StartNew();
BitmapImage ShowBitMap = null;
Bitmap BitmapImage = null;
List ShowResult = actionMesSqliteDataClass.GetActiveObjectForPage((ShowMessageBus.ShowBinding.HistoryImageNum - 1) * PageHeight + DataStartLine, ShowMessageBus.ShowBinding.HistoryImageNum * PageHeight + DataStartLine);
if (ShowResult.Count > 0)
{
int ThisImageStartLine = (int)ShowResult.Min(o => o.StartLine);
int ImageHeight = (int)(ShowResult.Max(o => o.LastSeenLine) - ShowResult.Min(o => o.StartLine))+50;
int ImageWidth = ShowResult.Max(o => o.ImageWidth);
BitmapImage = new Bitmap(ImageWidth, ImageHeight <= PageHeight ? PageHeight : ImageHeight);
using (Graphics g = Graphics.FromImage(BitmapImage))
{
g.Clear(System.Drawing.Color.White);
var redPen = new System.Drawing.Pen(System.Drawing.Color.Red, 1);
var bluePen = new System.Drawing.Pen(System.Drawing.Color.FromArgb(0, 146, 255), 1);
var GreenPen = new System.Drawing.Pen(System.Drawing.Color.SeaGreen, 5);
foreach (var item in ShowResult)
{
int roix = item.MinStartCol - 5;
int roiy = (int)(item.StartLine - ThisImageStartLine) + 15;
int roiheight = (int)(item.LastSeenLine - (long)item.StartLine) + 10;
int roiwidth = item.MaxEndCol - item.MinStartCol + 10;
g.DrawRectangle(GreenPen, new System.Drawing.Rectangle(roix, roiy, roiwidth, roiheight));
Font font = new Font("Arial", 20);
g.DrawString(item.Num.ToString(), font, System.Drawing.Brushes.Black, new System.Drawing.Point(roix - 20 * item.Num.ToString().Length, roiy - 20));
if(item.StateCode!=0)
{
string ErrorMessage = "";
if (item.StateCode == 1)
ErrorMessage = "LONG";
else if (item.StateCode == 2)
ErrorMessage = "SHORT";
else if (item.StateCode == 5)
ErrorMessage = "BIG";
else if (item.StateCode == 6)
ErrorMessage = "SMALL";
g.DrawString(ErrorMessage, font, System.Drawing.Brushes.Black, new System.Drawing.Point(roix - 20 * item.Num.ToString().Length, roiy - 50));
}
g.DrawString(item.Num.ToString(), font, System.Drawing.Brushes.Black, new System.Drawing.Point(roix - 20 * item.Num.ToString().Length, roiy - 20));
foreach (var item1 in item.RowsData)
{
int yPos = (int)(item1.RowsCol - ThisImageStartLine + 20);
g.DrawLine(item.StateCode == 0 ? bluePen : redPen, new System.Drawing.Point(item1.StartCol, yPos), new System.Drawing.Point(item1.EndCol, yPos));
}
}
}
}
else
{
BitmapImage = new Bitmap(4096, PageHeight);
using (Graphics g = Graphics.FromImage(BitmapImage))
{
g.Clear(System.Drawing.Color.White);
}
}
Application.Current.Dispatcher.InvokeAsync(() =>
{
ShowBitMap = ConvertToBitmapImage(BitmapImage);
ShowMessageBus.ShowBinding.HistoryImage = ShowBitMap;
});
stopwatch.Stop();
Console.WriteLine($"{stopwatch.ElapsedMilliseconds}ms");
NowPageError = ShowResult.Where(o => o.StateCode != 0).OrderBy(o => o.Num).ToList();
}
// Bitmap 转 BitmapImage 的辅助方法
private BitmapImage ConvertToBitmapImage(Bitmap bitmap)
{
using (MemoryStream memory = new MemoryStream())
{
bitmap.Save(memory, System.Drawing.Imaging.ImageFormat.Png);
memory.Position = 0;
var bitmapImage = new BitmapImage();
bitmapImage.BeginInit();
bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
bitmapImage.StreamSource = memory;
bitmapImage.EndInit();
return bitmapImage;
}
}
private void SkipBtn_Click(object sender, RoutedEventArgs e)
{
UpDateShowBinding();
}
///
/// 初始化批次列表
///
private void InitBatchItems()
{
string folderPath = $"{AppDomain.CurrentDomain.BaseDirectory}DATA\\ActiveObjectData\\Cam{MessageBus.NowSettingLoadMainThread.cameraConfig.CamerNo}";
if (!Directory.Exists(folderPath))
{
// 创建文件夹
Directory.CreateDirectory(folderPath);
}
try
{
// 使用 DirectoryInfo 获取文件并按修改时间排序
DirectoryInfo dirInfo = new DirectoryInfo(folderPath);
FileInfo[] files = dirInfo.GetFiles("*.db", SearchOption.AllDirectories);
// 按照修改时间排序(最新的在前)
var sortedFiles = files.OrderByDescending(f => f.LastWriteTime).ToArray();
ShowMessageBus.ShowBinding.BatchItems.Clear();
foreach (FileInfo file in sortedFiles)
{
ShowMessageBus.ShowBinding.BatchItems.Add(System.IO.Path.GetFileNameWithoutExtension(file.Name).Split('_')[1]);
}
BatchNumComBox.SelectedIndex = 0;
}
catch
{ }
}
///
/// 初始化批号列表
///
private void InitBatchItems(DateTime Mintime, DateTime MaxTime)
{
string folderPath = $"{AppDomain.CurrentDomain.BaseDirectory}DATA\\ActiveObjectData\\Cam{MessageBus.NowSettingLoadMainThread.cameraConfig.CamerNo}";
if (!Directory.Exists(folderPath))
{
// 创建文件夹
Directory.CreateDirectory(folderPath);
}
try
{
// 使用 DirectoryInfo 获取文件并按修改时间排序
DirectoryInfo dirInfo = new DirectoryInfo(folderPath);
FileInfo[] files = dirInfo.GetFiles("*.db", SearchOption.AllDirectories);
// 按照修改时间排序(最新的在前)
var sortedFiles = files.Where(f => f.CreationTime > Mintime && f.CreationTime < MaxTime.AddDays(1)).OrderByDescending(f => f.LastWriteTime).ToArray();
ShowMessageBus.ShowBinding.BatchItems.Clear();
foreach (FileInfo file in sortedFiles)
{
ShowMessageBus.ShowBinding.BatchItems.Add(System.IO.Path.GetFileNameWithoutExtension(file.Name).Split('_')[1]);
}
BatchNumComBox.SelectedIndex = 0;
}
catch
{ }
}
///
/// 初始化批号列表
///
private void InitBatchItemsByMinTime(DateTime Mintime)
{
string folderPath = $"{AppDomain.CurrentDomain.BaseDirectory}DATA\\ActiveObjectData\\Cam{MessageBus.NowSettingLoadMainThread.cameraConfig.CamerNo}";
if (!Directory.Exists(folderPath))
{
// 创建文件夹
Directory.CreateDirectory(folderPath);
}
try
{
// 使用 DirectoryInfo 获取文件并按修改时间排序
DirectoryInfo dirInfo = new DirectoryInfo(folderPath);
FileInfo[] files = dirInfo.GetFiles("*.db", SearchOption.AllDirectories);
// 按照修改时间排序(最新的在前)
var sortedFiles = files.Where(f => f.CreationTime > Mintime).OrderByDescending(f => f.LastWriteTime).ToArray();
ShowMessageBus.ShowBinding.BatchItems.Clear();
foreach (FileInfo file in sortedFiles)
{
ShowMessageBus.ShowBinding.BatchItems.Add(System.IO.Path.GetFileNameWithoutExtension(file.Name).Split('_')[1]);
}
BatchNumComBox.SelectedIndex = 0;
}
catch
{ }
}
///
/// 初始化批号列表
///
private void InitBatchItemsByMaxTime(DateTime MaxTime)
{
string folderPath = $"{AppDomain.CurrentDomain.BaseDirectory}DATA\\ActiveObjectData\\Cam{MessageBus.NowSettingLoadMainThread.cameraConfig.CamerNo}";
if (!Directory.Exists(folderPath))
{
// 创建文件夹
Directory.CreateDirectory(folderPath);
}
try
{
// 使用 DirectoryInfo 获取文件并按修改时间排序
DirectoryInfo dirInfo = new DirectoryInfo(folderPath);
FileInfo[] files = dirInfo.GetFiles("*.db", SearchOption.AllDirectories);
// 按照修改时间排序(最新的在前)
var sortedFiles = files.Where(f => f.CreationTime < MaxTime.AddDays(1)).OrderByDescending(f => f.LastWriteTime).ToArray();
ShowMessageBus.ShowBinding.BatchItems.Clear();
foreach (FileInfo file in sortedFiles)
{
ShowMessageBus.ShowBinding.BatchItems.Add(System.IO.Path.GetFileNameWithoutExtension(file.Name).Split('_')[1]);
}
BatchNumComBox.SelectedIndex = 0;
}
catch
{ }
}
private void BatchNumRecordMinTime_SelectedDateChanged(object sender, SelectionChangedEventArgs e)
{
if (BatchNumRecordMinTime.SelectedDate == null)
{
return;
}
else
{
if (BatchNumRecordMaxTime.SelectedDate == null)
{
InitBatchItemsByMinTime((DateTime)BatchNumRecordMinTime.SelectedDate);
}
else
{
InitBatchItems((DateTime)BatchNumRecordMinTime.SelectedDate, (DateTime)BatchNumRecordMaxTime.SelectedDate);
}
}
}
private void BatchNumRecordMaxTime_SelectedDateChanged(object sender, SelectionChangedEventArgs e)
{
if (BatchNumRecordMaxTime.SelectedDate == null)
{
return;
}
else
{
if (BatchNumRecordMinTime.SelectedDate == null)
{
InitBatchItemsByMaxTime((DateTime)BatchNumRecordMaxTime.SelectedDate);
}
else
{
InitBatchItems((DateTime)BatchNumRecordMinTime.SelectedDate, (DateTime)BatchNumRecordMaxTime.SelectedDate);
}
}
}
private void BatchNumRecordComBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (BatchNumComBox.SelectedItem != null && BatchNumComBox.SelectedItem.ToString() != string.Empty)
{
string BatchNumber = BatchNumComBox.SelectedItem.ToString();
actionMesSqliteDataClass = new ActionMesSqliteDataClass($"{AppDomain.CurrentDomain.BaseDirectory}DATA\\ActiveObjectData\\Cam{MessageBus.NowSettingLoadMainThread.cameraConfig.CamerNo}\\ActiveObjectData_{BatchNumber}.db");
//actionMesSqliteDataClass = new ActionMesSqliteDataClass($"{AppDomain.CurrentDomain.BaseDirectory}DATA\\ActiveObjectData\\Cam{MessageBus.MainThreadS[0].cameraConfig.CamerNo}\\ActiveObjectData_20250908.db");
actionMesSqliteDataClass.GetAllActionMinStartMaxEndLine(out int num, out int StartLine, out int EndLine);
ShowMessageBus.ShowBinding.HistoryImageCount = (EndLine - StartLine) / PageHeight;
DataStartLine = StartLine;
ShowMessageBus.ShowBinding.HistoryImageNum = 1;
UpDateShowBinding();
ErrorActive = actionMesSqliteDataClass.GetAllErrorAction().OrderBy(o=>o.Num).ToList();
}
}
private void Page_Loaded(object sender, RoutedEventArgs e)
{
BatchNumRecordMinTime.SelectedDate = DateTime.Today;
BatchNumRecordMaxTime.SelectedDate = DateTime.Today;
}
private void PreviousErrorBtn_Click(object sender, RoutedEventArgs e)
{
if (ErrorActive != null)
{
if(NowErrorNum-1<0)
{
MessageBox.Show("已经是第一粒");
}
else
{
if(NowPageError.Count>0)
{
int LastErrNum = NowPageError.Where(o => o.StateCode != 0).OrderBy(o => o.Num).First().Num;
NowErrorNum = ErrorActive.FindIndex(o => o.Num == LastErrNum);
if(NowErrorNum-1>=0) NowErrorNum--;
ShowMessageBus.ShowBinding.HistoryImageNum = ((int)(ErrorActive[NowErrorNum].StartLine - DataStartLine) / PageHeight) + 1;
}
else
{
ShowMessageBus.ShowBinding.HistoryImageNum = ((int)(ErrorActive[NowErrorNum].StartLine - DataStartLine) / PageHeight) + 1;
if (NowErrorNum - 1 >= 0) NowErrorNum--;
}
UpDateShowBinding();
}
}
}
private void NextErrorBtn_Click(object sender, RoutedEventArgs e)
{
if (ErrorActive != null)
{
if (NowErrorNum+1 >= ErrorActive.Count)
{
MessageBox.Show("已经是最后一粒");
}
else
{
if (NowPageError.Count > 0)
{
int LastErrNum = NowPageError.Where(o => o.StateCode != 0).OrderBy(o => o.Num).Last().Num;
NowErrorNum = ErrorActive.FindIndex(o => o.Num == LastErrNum);
if (NowErrorNum + 1 <= ErrorActive.Count - 1) NowErrorNum++;
ShowMessageBus.ShowBinding.HistoryImageNum = ((int)(ErrorActive[NowErrorNum].StartLine - DataStartLine) / PageHeight) + 1;
}
else
{
ShowMessageBus.ShowBinding.HistoryImageNum = ((int)(ErrorActive[NowErrorNum].StartLine - DataStartLine) / PageHeight) + 1;
if (NowErrorNum + 1 <= ErrorActive.Count - 1) NowErrorNum++;
}
UpDateShowBinding();
}
}
}
}
}