using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Data; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; using System.Windows.Input; using System.Windows.Media.Imaging; using Aitex.Core.RT.Event; using Aitex.Core.Util; using Caliburn.Micro; using DocumentFormat.OpenXml.Drawing; using MECF.Framework.Common.Aitex.Core.RT.EMS; using MECF.Framework.Common.DataCenter; using MECF.Framework.Common.OperationCenter; using MECF.Framework.UI.Client.CenterViews.DataLogs.Event; using MECF.Framework.UI.Client.ClientBase; using OpenSEMI.ClientBase; using OpenSEMI.ClientBase.Command; using SciChart.Core.Extensions; using Sicentury.Core.Collections; namespace MECF.Framework.UI.Client.CenterViews.Maintain.ViewModels { public class MaintainEventViewModel : UiViewModelBase, ISupportMultipleSystem { #region Properties MaintainEventView view; public ICommand NavigateCommand { get; set; } /// /// 搜索条件:开始时间 /// public DateTime SearchBeginTime { get => view.wfTimeFrom.Value; set { view.wfTimeFrom.Value = value; NotifyOfPropertyChange(nameof(SearchBeginTime)); } } /// /// 搜索条件:结束时间 /// public DateTime SearchEndTime { get => view.wfTimeTo.Value; set { view.wfTimeTo.Value = value; NotifyOfPropertyChange(nameof(SearchEndTime)); } } private List _plannames = new(); /// /// 复选框选项:PlanNames(List不会更新) /// public List PlanNames { get { return _plannames; } set { _plannames = value; NotifyOfPropertyChange(nameof(PlanNames)); } } private ObservableCollection _planmodules = new(); /// /// 复选框选项:PlanModules(随着planname更新) /// public ObservableCollection PlanModules { get { return _planmodules; } set { _planmodules = value; NotifyOfPropertyChange(nameof(PlanModules)); } } private Dictionary> planmoduledic = new Dictionary>(); private string _searchplanname = ""; /// /// 搜索条件:Plan /// public string SearchPlanName { get { return _searchplanname; } set { if (_searchplanname != value) { _searchplanname = value; NotifyOfPropertyChange(nameof(SearchPlanName)); SearchPlanModule = ""; PlanModules.Clear(); if (planmoduledic.Keys.Contains(value)) { planmoduledic[value].ForEach(PlanModules.Add); } } } } private string _searchplanmodule = ""; /// /// 搜索条件:Module /// public string SearchPlanModule { get { return _searchplanmodule; } set { _searchplanmodule = value; NotifyOfPropertyChange(nameof(SearchPlanModule)); } } private List items = new(); private List _parentitemnames = new(); /// /// 复选框选项:ParentItemNames(List不会更新) /// public List ParentItemNames { get { return _parentitemnames; } set { _parentitemnames = value; NotifyOfPropertyChange(nameof(ParentItemNames)); } } private ObservableCollection _itemnames = new(); /// /// 复选框选项:ParentItemNames(随着ParentItemName更新) /// public ObservableCollection ItemNames { get { return _itemnames; } set { _itemnames = value; NotifyOfPropertyChange(nameof(ItemNames)); } } private ObservableCollection _itemindexs = new() {"" }; /// /// 复选框选项:ParentItemNames(随着ParentItemName更新) /// public ObservableCollection ItemIndexs { get { return _itemindexs; } set { _itemindexs = value; NotifyOfPropertyChange(nameof(ItemIndexs)); } } private string _searchparentitemname=""; /// /// 搜索条件:ParentItem /// public string SearchParentItemName { get { return _searchparentitemname; } set { if (_searchparentitemname != value) { _searchparentitemname = value; NotifyOfPropertyChange(nameof(SearchParentItemName)); ItemNames.Clear(); ItemIndexs.Clear(); ItemNames.Add(""); ItemIndexs.Add(""); items.ForEach(i => { if (i.ParentName == _searchparentitemname) { if (!ItemNames.Contains(i.Name)) { ItemNames.Add(i.Name); } } }); SearchItemName = ""; SearchIndex = ""; } } } private string _searchitemname = ""; /// /// 搜索条件:Item /// public string SearchItemName { get { return _searchitemname; } set { if (_searchitemname != value) { _searchitemname = value; NotifyOfPropertyChange(nameof(SearchItemName)); ItemIndexs.Clear(); ItemIndexs.Add(""); ItemIndexs.Add("0"); items.ForEach(i => { if (i.ParentName == _searchparentitemname && i.Name == _searchitemname) { if (!ItemIndexs.Contains(i.Index.ToString())) { ItemIndexs.Add(i.Index.ToString()); } } }); SearchIndex = ""; } } } private string _searchindex = "0"; /// /// 搜索条件:Index /// public string SearchIndex { get { return _searchindex; } set { _searchindex = value; NotifyOfPropertyChange(nameof(SearchIndex)); } } private string _searchkeywords = ""; /// /// 搜索条件:Index /// public string SearchKeyWords { get { return _searchkeywords; } set { _searchkeywords = value; NotifyOfPropertyChange(nameof(SearchKeyWords)); } } List queryresult = new(); /// /// 返回受支持的分页每页容量。 /// public List PaginationCapacity { get; } private int _selectedPaginationCapacity; /// /// 返回选择的分页每页容量。 /// public int SelectedPaginationCapacity { get => _selectedPaginationCapacity; set { _selectedPaginationCapacity = value; Query(); } } /// /// 更新分页信息。 /// Tuple.Item1: 当前页号 /// Tuple.Item2: 总页号;设置为-1时表示忽略更新总页号。 /// private readonly IProgress> _progUpdatePaginationInfo; /// /// 更新查询状态。 /// private readonly IProgress _progUpdateQueryStatus; public ObservableRangeCollection SearchedResult { get; private set; } /// /// 显示查询到的事件日志列表。 /// private readonly IProgress> _progShowSearchingResult; private List _alleventinfos = new(); public List AllEvenInfos { get { return _alleventinfos; } set { _alleventinfos = value; NotifyOfPropertyChange(nameof(AllEvenInfos)); } } private bool _isLoading; /// /// 返回是否正在加载数据。 /// public bool IsLoading { get => _isLoading; set { _isLoading = value; NotifyOfPropertyChange(nameof(IsLoading)); } } /// /// 页码列表,用于快速跳转页面下拉框数据源。 /// public ObservableRangeCollection PaginationSource { get; } /// /// 页码信息。 /// public string PageInfo => $"{_currentPage}/{_totalPage}"; private int _currentPage; private int _totalPage; private int _selectedPage; public int SelectedPage { get => _selectedPage; set { _selectedPage = value; Query(_selectedPage); } } #endregion #region Constructors public MaintainEventViewModel() { DisplayName = "MaintainEvent"; SearchedResult = new ObservableRangeCollection(); PaginationSource = new ObservableRangeCollection(); NavigateCommand = new BaseCommand(Navigate, (o) => true); // 分页支持的每页Log数量 //! 最小每页条目数使用30,以保证正好显示一页而不出现纵向滚动条。 PaginationCapacity = new List { 30, 300, 3000 }; _selectedPaginationCapacity = PaginationCapacity.Last(); _totalPage = 1; _currentPage = 1; #region 获取plan搜索条件信息 List maintainerlist = (List)QueryDataClient.Instance.Service.GetData("MaintainManager.MaintainerInfos"); PlanNames.Add(""); planmoduledic.Add("", new List() { "" }); foreach (MaintainerInfo item in maintainerlist) { PlanNames.AddIfNotContains(item.Name); if (!planmoduledic.ContainsKey(item.Name)) { planmoduledic.Add(item.Name, new List() { "" }); } planmoduledic[item.Name].AddIfNotContains(item.Module); } #endregion #region 获取item搜索条件信息 items = (List)QueryDataClient.Instance.Service.GetData("MaintainManager.MaintainerConfigItems"); ParentItemNames = new List() { "" }; ItemNames = new ObservableCollection() { "" }; ItemIndexs = new ObservableCollection { "0" }; items.ForEach(i => { ParentItemNames.AddIfNotContains(i.ParentName); }); #endregion #region 显示查询到的列表 _progShowSearchingResult = new Progress>((queryRet => { if (SearchedResult == null) SearchedResult = new ObservableRangeCollection(); else SearchedResult.Clear(); queryRet.ForEach(i => { foreach (var item in items) { if (item.ParentName == i.ParentItemName && item.Name == i.ItemName && item.Index == i.Index) { i.Description = item.Description; break; } } }); queryresult = queryRet; SearchedResult.AddRange(queryRet); })); #endregion #region 更新分页信息 _progUpdatePaginationInfo = new Progress>(pageInfo => { _currentPage = pageInfo.Item1; if (pageInfo.Item2 > 0) { _totalPage = pageInfo.Item2; PaginationSource.Clear(); PaginationSource.AddRange(Enumerable.Range(1, _totalPage)); NotifyOfPropertyChange(nameof(PaginationSource)); } NotifyOfPropertyChange(nameof(PageInfo)); _selectedPage = _currentPage; NotifyOfPropertyChange(nameof(SelectedPage)); }); #endregion #region 更新查询状态 _progUpdateQueryStatus = new Progress(isBusy => { IsLoading = isBusy; }); #endregion } #endregion #region Functions public void Navigate(string args) { switch (args) { case "first": if (_currentPage == 1) return; _currentPage = 1; break; case "previous": if (_currentPage > 1) _currentPage--; break; case "next": if (_currentPage < _totalPage) _currentPage++; break; case "last": if (_currentPage == _totalPage) return; _currentPage = _totalPage; break; default: return; } Query(_currentPage); } protected override void OnInitialize() { ActiveUpdateData = false; //关闭界面后不开启后台线程,减少开销 } protected override void OnViewLoaded(object view) { base.OnViewLoaded(view); // 默认的查询时间设置为当天 this.view = (MaintainEventView)view; SearchBeginTime = DateTime.Today.AddDays(-30); SearchEndTime = DateTime.Today.AddDays(1).AddTicks(-1); Preload(); } private void Preload() { Query(); } public void Filter() { SearchedResult.Clear(); var keywords = SearchKeyWords.ToLower(); queryresult.ForEach(i => { if (i.PlanName.ToLower().Contains(keywords) || i.PlanModule.ToLower().Contains(keywords) || i.ParentItemName.ToLower().Contains(keywords) || i.ItemName.ToLower().Contains(keywords) || i.Description.ToLower().Contains(keywords) || i.Record.ToLower().Contains(keywords)) { SearchedResult.Add(i); } }); } /// /// 查询数据。 /// /// 待查询的页号 /// 是否包含过滤条件。 /// public void Query(int page = -1) { if (SearchBeginTime > SearchEndTime) { DialogBox.ShowError("Time range invalid, start time should be early than end time"); return; } Task.Run(() => { var searchingResult = new List(); // 查询开始 _progUpdateQueryStatus.Report(true); if (page <= -1) // Query按钮按下,或首次加载界面 { // 统计总页数 var rowCount = QueryRowAmount( SearchBeginTime, SearchEndTime, SearchPlanName, SearchPlanModule, SearchParentItemName, SearchItemName, SearchIndex == "" ? -1 : int.Parse(SearchIndex)); var totalPage = (int)Math.Ceiling(rowCount / (double)SelectedPaginationCapacity); // 首次查询第一页 searchingResult = QueryEventLogs( 1, SelectedPaginationCapacity, SearchBeginTime, SearchEndTime, SearchPlanName, SearchPlanModule, SearchParentItemName, SearchItemName, SearchIndex == "" ? -1 : int.Parse(SearchIndex)); // 更新页面信息 _progUpdatePaginationInfo.Report(new Tuple(1, totalPage)); } else if (page >= 1) { // 翻页按钮按下 searchingResult = QueryEventLogs( page, SelectedPaginationCapacity, SearchBeginTime, SearchEndTime, SearchPlanName, SearchPlanModule, SearchParentItemName, SearchItemName, SearchIndex == "" ? -1 : int.Parse(SearchIndex)); // 更新页面信息 _progUpdatePaginationInfo.Report(new Tuple(page, -1)); } else { throw new ArgumentOutOfRangeException(nameof(page), "invalid page number."); } // 显示结果 _progShowSearchingResult.Report(searchingResult); // 查询完毕 _progUpdateQueryStatus.Report(false); }); } #endregion #region 数据库查询 /// /// 获取查询语句中select部分表达式。 /// private string GetEventLogQuerySql(DateTime begintime, DateTime endtime) { return "SELECT \"planname\", \"planmodule\", \"itemparentname\", \"itemname\", \"uid\",\"createtime\" , \"role\", \"detial\" FROM \"maintainance_event_data\"" + GetWhereTimeRangeExpression(begintime, endtime); } /// /// 获取EventLog行数查询语句中select部分表达式。 /// private string GetEventCountSql(DateTime begintime, DateTime endtime) { return "SELECT COUNT(1) FROM \"maintainance_event_data\"" + GetWhereTimeRangeExpression(begintime, endtime); } /// /// 获取WHERE条件中的“时间范围”子句。 /// 注意:所有Select语句构造时必须包含TimeRange条件。 /// /// private string GetWhereTimeRangeExpression(DateTime begintime, DateTime endtime) { var sql = new StringBuilder( $" WHERE \"createtime\" BETWEEN '{begintime:yyyy/MM/dd HH:mm:ss}' AND '{endtime:yyyy/MM/dd HH:mm:ss}'"); return sql.ToString(); } /// /// 获取WHERE条件中的plan条件子句。 /// /// private string GetWherePlanExpression(string planname = "", string module = "") { return ((planname == "") ? "" : $" AND \"planname\" = '{planname}'") + ((module == "") ? "" : $" AND \"planmodule\" = '{module}'"); } /// /// 获取WHERE条件中的item条件子句。 /// /// private string GetWhereItemExpression(string itemparentname = "", string itemname = "", int index = -1) { return ((itemparentname == "") ? "" : $" AND \"itemparentname\" = '{itemparentname}'") + ((itemname == "") ? "" : $" AND \"itemname\" = '{itemname}'") + ((index == -1) ? "" : $"AND \"index\" = '{index}'"); } /// /// 获取WHERE条件中的“关键字”子句。 /// /// private string GetWhereQueryKeyWordsExpression(string keywords) { return string.IsNullOrEmpty(keywords) ? "" : $" AND (lower(\"description\") like lower('%{keywords}%'))" + $" AND (lower(\"detial\") like lower('%{keywords}%'))"; } /// /// 获取SQL查询语句中的分页表达式。 /// /// /// /// /// private string GetPaginationExpression(int countPerPage, int currentPage) { if (countPerPage <= 0) throw new ArgumentOutOfRangeException(nameof(countPerPage), "the amount items per page can not be less than 1."); if (currentPage <= 0) throw new ArgumentOutOfRangeException(nameof(currentPage), "the current page required can not be less than 1."); return $" ORDER BY \"createtime\" LIMIT {countPerPage} OFFSET {countPerPage * (currentPage - 1)}"; } /// /// 查询当前条件下共有多少行数据。 /// 是否包含过滤条件。 /// public int QueryRowAmount( DateTime begintime, DateTime endtime, string planname, string module, string itemparentname, string itemname, int index) { string s1 = GetEventCountSql(begintime, endtime); string s2 = planname == "" ? "" : GetWherePlanExpression(planname, module); string s3 = itemparentname == "" ? "" : GetWhereItemExpression(itemparentname, itemname, index); //string s4 = keywords == "" ? "" : GetWhereQueryKeyWordsExpression(keywords); var sql = s1 + s2 + s3; var dt = QueryDataClient.Instance.Service.QueryData(sql); // 未查询到任何数据。 if (dt == null || dt.Rows.Count <= 0 || dt.Columns.Count <= 0) return 0; // 返回满足当前条件的行数。 return int.Parse(dt.Rows[0][0].ToString()); } /// /// 查询符合条件的事件日志。 /// /// 待查询页码。0:查询所有数据而不分页;其它:查询指定的页码。 /// 是否包含过滤条件。 /// 页码错误,页码必须为大于等于0的整数。 /// public List QueryEventLogs( int page, int pageSize, DateTime begintime, DateTime endtime, string planname, string module, string itemparentname, string itemname, int index) { if (page < 0) throw new ArgumentOutOfRangeException(nameof(page), "the page number must be greater than 0."); string s1 = GetEventLogQuerySql(begintime, endtime); string s2 = planname == "" ? "" : GetWherePlanExpression(planname, module); string s3 = itemparentname == "" ? "" : GetWhereItemExpression(itemparentname, itemname, index); //string s4 = keywords == "" ? "" : GetWhereQueryKeyWordsExpression(keywords); var sql = s1 + s2 + s3; // page == 0 表示查询所有数据,仅导出Excel时使用。 if (page > 0) sql += GetPaginationExpression(pageSize, page); var dt = QueryDataClient.Instance.Service.QueryData(sql); // 未查询到任何数据。 if (dt == null || dt.Rows.Count <= 0 || dt.Columns.Count <= 0) return new List(); var list = new List(); foreach (var row in dt.Rows) { DataRow dr = row as DataRow; try { MaintainEventInfo me = new MaintainEventInfo() { PlanName = dr[0].ToString(), PlanModule = dr[1].ToString(), ParentItemName = dr[2].ToString(), ItemName = dr[3].ToString(), Index = int.Parse(dr[4].ToString()), MaintainTime = DateTime.Parse(dr[5].ToString()), Recorder = dr[6].ToString(), Record = dr[7].ToString() }; list.Add(me); } catch (Exception ex) { continue; } } return list; } #endregion } }