using HandyControl.Controls; using MiniExcelLibs; using Ping9719.WpfEx.Mvvm; using System; using System.Collections.Generic; using System.Linq; using System.Runtime.CompilerServices; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Input; using System.Windows.Media; using SqlSugar; using HandyControl.Data; using System.Windows; namespace 智能仓储WCS管理系统.ViewModel { public class DataListViewModel : BindableBase { private List dataList = new List(); /// /// 列表数据 /// public List DataList { get => dataList; set { SetProperty(ref dataList, value); } } #region 进度 private bool IsLoad_; public bool IsLoad { get => IsLoad_; set { SetProperty(ref IsLoad_, value); } } #endregion #region 筛选 private DateTime? timeGo = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day); /// /// 开始时间(默认只显示今天开始的数据) /// public DateTime? TimeGo { get => timeGo; set { SetProperty(ref timeGo, value); } } private DateTime? timeTo; /// /// 结束时间 /// public DateTime? TimeTo { get => timeTo; set { SetProperty(ref timeTo, value); } } private string info1; public string Info1 { get => info1; set { SetProperty(ref info1, value); } } private string info2; public string Info2 { get => info2; set { SetProperty(ref info2, value); } } #endregion #region 页码 private int maxPageCount; /// /// 最大页数 /// public int MaxPageCount { get => maxPageCount; set { SetProperty(ref maxPageCount, value); } } private int pageIndex = 1; /// /// 当前页 /// public int PageIndex { get => pageIndex; set { SetProperty(ref pageIndex, value); } } private int dataCountPerPage = 20; /// /// 每页的数据量 /// public int DataCountPerPage { get => dataCountPerPage; set { SetProperty(ref dataCountPerPage, value); } } public ICommand PageUpdateCommand { get => new DelegateCommand>(PageUpdate); } /// /// 页码更新 /// public void PageUpdate(FunctionEventArgs page) { PageIndex = page.Info; UpdateList(); } #endregion public ICommand ExportExcelCommand { get => new DelegateCommand(ExportExcel); } /// /// 导出为excel /// public async void ExportExcel() { if (IsLoad) { Growl.Info("有任务正在进行,请稍等片刻。"); return; } IsLoad = true; Microsoft.Win32.SaveFileDialog sfd = new Microsoft.Win32.SaveFileDialog(); sfd.Filter = ".xlsx文件(*.xlsx)|*.xlsx"; sfd.FileName = "XXXX记录信息"; sfd.OverwritePrompt = true; if (sfd.ShowDialog() != true) { IsLoad = false; return; } string path = sfd.FileName; try { //1.查询数据库,加入筛选条件,并按照时间倒序排序,并导出指定列 var dbData = DataDb.db.Queryable() .WhereIF(TimeGo != null, o => o.Time > TimeGo) .WhereIF(TimeTo != null, o => o.Time < TimeTo) .WhereIF(!string.IsNullOrWhiteSpace(Info1), o => o.Info1.StartsWith(Info1.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(Info2), o => o.Info2.StartsWith(Info2.Trim())) .OrderByDescending(o => o.Id) .Select(o => new { 产品信息1 = o.Info1, 产品信息2 = o.Info2, 状态结果 = o.Status, 创建时间 = o.Time.ToString("yyyy-MM-dd HH:mm:ss"), }); //2.导出为Excel,使用内存缓存的方式,防止数据量过大导致内存泄露 var sqlkv = dbData.ToSql(); var dataReader = await DataDb.db.Ado.GetDataReaderAsync(sqlkv.Key, sqlkv.Value); await MiniExcel.SaveAsAsync(path, dataReader, overwriteFile: true); dataReader.Close(); Growl.Success("导出成功。"); } catch (Exception ex) { Growl.Error("导出失败:" + ex.Message); } finally { IsLoad = false; } } public ICommand UpdateListCommand { get => new DelegateCommand(UpdateList); } /// /// 更新信息 /// public async void UpdateList() { if (IsLoad) { Growl.Info("有任务正在进行,请稍等片刻。"); return; } IsLoad = true; try { await Task.Delay(200); //1.查询数据库,加入筛选条件,并按照时间倒序排序 var dbData = DataDb.db.Queryable() .WhereIF(TimeGo != null, o => o.Time > TimeGo) .WhereIF(TimeTo != null, o => o.Time < TimeTo) .WhereIF(!string.IsNullOrWhiteSpace(Info1), o => o.Info1.StartsWith(Info1.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(Info2), o => o.Info2.StartsWith(Info2.Trim())) .OrderByDescending(o => o.Id); //2.开始分页(如模型不一样使用‘.Select()’来转换) RefAsync totalNumber = 0; RefAsync totalPage = 0; DataList = await dbData.ToPageListAsync(PageIndex, DataCountPerPage, totalNumber, totalPage); MaxPageCount = totalPage.Value; } catch (Exception ex) { Growl.Error("加载数据失败:" + ex.Message); } finally { IsLoad = false; } } public ICommand SeeCommand { get => new DelegateCommand(See); } /// /// 查看详情 /// public void See(MyTestTable obj) { if (IsLoad) { Growl.Info("有任务正在进行,请稍等片刻。"); return; } Growl.Info("信息:" + Newtonsoft.Json.JsonConvert.SerializeObject(obj)); } } }