AHAQ_QGNH/AnQing/ViewModel/WindowQueryViewModel.cs
2025-05-19 09:31:47 +08:00

437 lines
14 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections.ObjectModel;
using System.Windows.Input;
using System.Data;
using System.Windows.Controls;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using AnQing.Models;
using RGD.DBUtility;
using AnQing.Commons;
using Microsoft.Win32;
using Microsoft.WindowsAPICodePack.Dialogs;
using System.Windows.Media.Imaging;
namespace RFIDReaderJilin.ViewModel
{
public class WindowQueryViewModel : INotifyPropertyChanged
{
private ObservableCollection<SCAN_MAIN> _dgScanMain = new ObservableCollection<SCAN_MAIN>();
public ObservableCollection<SCAN_MAIN> DgScanMain
{
get => _dgScanMain;
set
{
if (_dgScanMain != value)
{
_dgScanMain = value;
OnPropertyChanged();
OnPropertyChanged(nameof(MaxPageCount)); // 数据加载后更新 MaxPageCount
DgScanMain_Pagination = new ObservableCollection<SCAN_MAIN>(DgScanMain.Skip((PageIndex - 1) * DataCountPerPage).Take(DataCountPerPage));
}
}
}
private ObservableCollection<SCAN_MAIN> _dgScanMain_Pagination = new ObservableCollection<SCAN_MAIN>();
public ObservableCollection<SCAN_MAIN> DgScanMain_Pagination
{
get => _dgScanMain_Pagination;
set
{
_dgScanMain_Pagination = value;
OnPropertyChanged();
}
}
private ICommand buttonQuit2Command;
public ICommand ButtonQuit2Command => buttonQuit2Command ??= new RelayCommand(ButtonQuit2);
private ICommand buttonQuitCommand;
public ICommand ButtonQuitCommand => buttonQuitCommand ??= new RelayCommand(ButtonQuit);
private ICommand buttonQueryCommand;
public ICommand ButtonQueryCommand => buttonQueryCommand ??= new RelayCommand(ButtonQuery);
private ICommand buttonQueryClearCommand;
public ICommand ButtonQueryClearCommand => buttonQueryClearCommand ??= new RelayCommand(ButtonQueryClear);
private ICommand buttonExportCommand;
public ICommand ButtonExportCommand => buttonExportCommand ??= new RelayCommand(ButtonExport);
public WindowQueryViewModel()
{
LoadScanMain();
}
/// <summary>
/// 初始化获取所有历史记录
/// </summary>
private void LoadScanMain()
{
Task.Run(() =>
{
DataView dv = DbHelperSQL.Query("select * from SCAN_MIAN").Tables[0].DefaultView;
DgScanMain = Common.ConvertDataViewToObservableCollection<SCAN_MAIN>(dv);
});
}
/// <summary>
/// 退出页面
/// </summary>
private void ButtonQuit() => Common.MenuViewQuit();
/// <summary>
/// 退出页面
/// </summary>
private void ButtonQuit2()
{
SelectMain = null;
Common.historycontrol.List_DeTail.Visibility = System.Windows.Visibility.Collapsed;
}
#region
private string _barcodes;
private string _startTime;
private string _endTime;
public string Barcodes
{
get => _barcodes;
set
{
if (_barcodes != value)
{
_barcodes = value;
OnPropertyChanged(nameof(Barcodes));
}
}
}
public string StartTime
{
get => _startTime;
set
{
if (_startTime != value)
{
_startTime = value;
OnPropertyChanged(nameof(StartTime));
}
}
}
public string EndTime
{
get => _endTime;
set
{
if (_endTime != value)
{
_endTime = value;
OnPropertyChanged(nameof(EndTime));
}
}
}
/// <summary>
/// 查询事件
/// </summary>
private void ButtonQuery()
{
try
{
string sql = "select * from SCAN_MIAN";
if (!string.IsNullOrEmpty(Barcodes))
{
sql += $" where goodcode='{Barcodes}'";
}
else
{
sql += " where 1=1";
}
if (!string.IsNullOrEmpty(StartTime))
{
sql += $" AND time >= '{DateTime.Parse(StartTime).ToString("yyyy-MM-dd HH:mm:ss")}'";
}
if (!string.IsNullOrEmpty(EndTime))
{
sql += $" AND time <= '{DateTime.Parse(EndTime).ToString("yyyy-MM-dd HH:mm:ss")}'";
}
sql += " order by time desc";
DataView dv = DbHelperSQL.Query(sql).Tables[0].DefaultView;
DgScanMain = Common.ConvertDataViewToObservableCollection<SCAN_MAIN>(dv);
}
catch (Exception ex)
{
throw;
}
}
/// <summary>
/// 清空查询条件
/// </summary>
private void ButtonQueryClear()
{
try
{
Barcodes = "";
StartTime = "";
EndTime = "";
DataView dv = DbHelperSQL.Query("select * from SCAN_MIAN").Tables[0].DefaultView;
DgScanMain = Common.ConvertDataViewToObservableCollection<SCAN_MAIN>(dv);
}
catch (Exception ex)
{
}
}
private void ButtonExport()
{
try
{
var dialog = new CommonOpenFileDialog();
dialog.IsFolderPicker = true;
CommonFileDialogResult result = dialog.ShowDialog();
if (result == CommonFileDialogResult.Ok)
{
string path = dialog.FileName + $"\\{DateTime.Now.ToString("yyyyMMddHHmmss")}导出.xlsx";
Task.Run(() =>
{
Common.SaveToExcel(DgScanMain, path);
});
}
}
catch (Exception ex)
{
}
}
#endregion
#region
/// <summary>
/// 页码数
/// </summary>
public int MaxPageCount => (int)Math.Ceiling((double)DgScanMain.Count / (double)DataCountPerPage);
/// <summary>
/// 当前选中页码
/// </summary>
private int _pageIndex = 1;
public int PageIndex
{
get => _pageIndex;
set
{
if (_pageIndex != value)
{
_pageIndex = value;
OnPropertyChanged(nameof(PageIndex));
UpdatePagination(1);
}
}
}
/// <summary>
/// 每页显示最多数 --当前选中的
/// </summary>
private int _dataCountPerPage = 10;
public int DataCountPerPage
{
get => _dataCountPerPage;
set
{
if (_dataCountPerPage != value)
{
_dataCountPerPage = value;
OnPropertyChanged(nameof(DataCountPerPage));
OnPropertyChanged(nameof(MaxPageCount));
UpdatePagination(1);
}
}
}
private void UpdatePagination(int type)
{
try
{
if (type == 1)
{
DgScanMain_Pagination = new ObservableCollection<SCAN_MAIN>(
DgScanMain.Skip((PageIndex - 1) * DataCountPerPage).Take(DataCountPerPage)
);
}
else if (type == 2)
{
string sql = "select * from SCAN_MIAN";
switch (DataCountPageTimeSelect)
{
case "当天":
sql += " WHERE time >= CAST(GETDATE() AS DATE)";
break;
case "近三天":
sql += " WHERE time >= DATEADD(DAY, -3, GETDATE())";
break;
case "近三十天":
sql += " WHERE time >= DATEADD(DAY, -30, GETDATE())";
break;
}
sql += " order by time desc";
DataView dv = DbHelperSQL.Query(sql).Tables[0].DefaultView;
DgScanMain = Common.ConvertDataViewToObservableCollection<SCAN_MAIN>(dv);
}
}
catch (Exception ex)
{
}
}
/// <summary>
/// 页面切换
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public void Pagination_PageUpdated(object sender, HandyControl.Data.FunctionEventArgs<int> e)
{
try
{
PageIndex = e.Info;
}
catch (Exception ex)
{
}
}
/// <summary>
/// 每页显示多少数据
/// </summary>
private int[] _dataCountPageNumber = { 10, 30, 60, 100, 200, 300 };
public int[] DataCountPageNumber
{
get => _dataCountPageNumber;
set
{
if (_dataCountPageNumber != value)
{
_dataCountPageNumber = value;
OnPropertyChanged(nameof(DataCountPageNumber));
}
}
}
/// <summary>
/// 查找近几天的
/// </summary>
private string[] _dataCountPageTime = { "全部时间","当天", "近三天", "近三十天" };
public string[] DataCountPageTime
{
get => _dataCountPageTime;
set
{
if (_dataCountPageTime != value)
{
_dataCountPageTime = value;
OnPropertyChanged(nameof(DataCountPageTime));
}
}
}
/// <summary>
/// 查找近几天的 --当前选中的
/// </summary>
private string _dataCountPageTimeSelect = "全部时间";
public string DataCountPageTimeSelect
{
get => _dataCountPageTimeSelect;
set
{
if (_dataCountPageTimeSelect != value)
{
_dataCountPageTimeSelect = value;
OnPropertyChanged(nameof(DataCountPageTimeSelect));
UpdatePagination(2);
}
}
}
/// <summary>
/// 查找近几天的
/// </summary>
private SCAN_MAIN_IMG _selectMain;
public SCAN_MAIN_IMG SelectMain
{
get => _selectMain;
set
{
if (_selectMain != value)
{
_selectMain = value;
OnPropertyChanged(nameof(SelectMain));
}
}
}
public void UpdateSelectMain(SCAN_MAIN mAIN)
{
if (SelectMain != null)
{
// 释放旧的 BitmapImage 资源
DisposeBitmapImage(SelectMain.img_after);
DisposeBitmapImage(SelectMain.img);
}
var newMain = new SCAN_MAIN_IMG
{
id = mAIN.id,
goodcode = mAIN.goodcode,
time = mAIN.time,
ex = mAIN.ex,
img_after = CreateBitmapImage(mAIN.img_after),
img = CreateBitmapImage(mAIN.img)
};
SelectMain = newMain; // 直接替换对象
}
/// <summary>
/// 释放 BitmapImage 资源
/// </summary>
/// <param name="bitmapImage"></param>
private void DisposeBitmapImage(BitmapImage bitmapImage)
{
if (bitmapImage != null)
{
bitmapImage.StreamSource?.Dispose();
bitmapImage.StreamSource = null;
bitmapImage = null; // 彻底释放对象
}
}
/// <summary>
/// 创建 BitmapImage
/// </summary>
/// <param name="imagePath">图片路径</param>
/// <returns>返回新的 BitmapImage</returns>
private BitmapImage CreateBitmapImage(string imagePath)
{
var newBitmap = new BitmapImage();
newBitmap.BeginInit();
newBitmap.CacheOption = BitmapCacheOption.OnLoad; // 立刻加载到内存,释放文件句柄
newBitmap.DecodePixelWidth = 800; // 限制宽度
newBitmap.DecodePixelHeight = 620; // 限制高度
newBitmap.UriSource = new Uri(imagePath, UriKind.Absolute);
newBitmap.EndInit();
newBitmap.Freeze(); // 让其在 UI 线程外使用
return newBitmap;
}
#endregion
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
}