EquipmentPropMonitorVM.cs 5.73 KB
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using HandyControl.Data;
using HHECS.BllModel;
using HHECS.DAQClient.Model;
using HHECS.DAQClient.Services;
using HHECS.DAQClient.ViewModel.EquipmentVM;
using HHECS.EquipmentModel;
using LinqKit;
using System.Collections.ObjectModel;
using System.Linq.Expressions;
using System.Windows;
using System.Windows.Threading;
using MessageBox = HandyControl.Controls.MessageBox;

namespace HHECS.DAQClient.ViewModel.EquipmentPropVM
{
    public partial class EquipmentPropMonitorVM : ObservableObject
    {
        [ObservableProperty]
        private string equipmentPropCode;

        [ObservableProperty]
        private string equipmentPropName;

        [ObservableProperty]
        private Dictionary<string, EquipmentPropType?> equipmentPropTypes = new Dictionary<string, EquipmentPropType?>();

        [ObservableProperty]
        private EquipmentPropType? equipmentPropType;

        [ObservableProperty]
        private ObservableCollection<EquipmentPropExtend> equipmentPropList = new ObservableCollection<EquipmentPropExtend>();

        [ObservableProperty]
        private int pageIndex = 1;

        [ObservableProperty]
        private long maxPage;

        [ObservableProperty]
        private int pageSize = 30;

        public Window Owner { get; set; }

        /// <summary>
        /// 设备Id
        /// </summary>
        private int EquipmentId { get; set; }

        private readonly IFreeSql _freeSql;
        private readonly CenterService _centerService;

        public EquipmentPropMonitorVM(IFreeSql freeSql, CenterService centerService)
        {
            _freeSql = freeSql;
            _centerService = centerService;
        }

        public void InitialData(EquipmentExtend equipment, CancellationTokenSource cancellationTokenSource)
        {
            var keyValuePairs = new Dictionary<string, EquipmentPropType?>
            {
                { "全部",null }
            };
            foreach (var item in Enum.GetNames<EquipmentPropType>())
            {
                keyValuePairs.Add(item, Enum.Parse<EquipmentPropType>(item));
            }
            EquipmentPropTypes = keyValuePairs;
            Owner.Title = $"{equipment.Name}-属性数据";
            EquipmentId = equipment.Id;
            LoadData();
            RefreshValues(cancellationTokenSource);
        }

        [RelayCommand]
        public void Serach()
        {
            var result = LoadData();
            if (!result.Success)
            {
                MessageBox.Error($"[{nameof(EquipmentPropMonitorVM)}]加载数据失败.{result.Msg}");
            }
        }

        /// <summary>
        /// 页码改变
        /// </summary>
        [RelayCommand]
        private void PageUpdated(FunctionEventArgs<int> info)
        {
            PageIndex = info.Info;
            LoadData();
        }

        private BllResult LoadData()
        {
            try
            {
                var query = _freeSql.Queryable<EquipmentPropExtend>().Where(GetFilter()).Include(x => x.EquipmentTypePropTemplate);
                var total = query.Count();
                MaxPage = total / PageSize + Convert.ToInt32(total % PageSize != 0);
                var result = query.Page(PageIndex, PageSize).ToList();
                EquipmentPropList = new ObservableCollection<EquipmentPropExtend>(result);
                return BllResultFactory.Success();
            }
            catch (Exception ex)
            {
                return BllResultFactory.Error(ex.Message);
            }
        }

        private Expression<Func<EquipmentPropExtend, bool>> GetFilter()
        {
            var filter = PredicateBuilder.New<EquipmentPropExtend>(x => x.EquipmentId.Equals(EquipmentId));
            if (!string.IsNullOrWhiteSpace(EquipmentPropCode))
            {
                filter = filter.And(x => x.EquipmentTypePropTemplateCode.Contains(EquipmentPropCode));
            }
            if (!string.IsNullOrWhiteSpace(EquipmentPropName))
            {
                filter = filter.And(x => x.Remark.Contains(EquipmentPropName));
            }
            if (EquipmentPropType != null)
            {
                filter = filter.And(x => x.EquipmentTypePropTemplate.PropType == EquipmentPropType);
            }
            return filter;
        }

        /// <summary>
        /// 定时刷新Value数据
        /// </summary>
        private void RefreshValues(CancellationTokenSource cancellationTokenSource)
        {
            Task.Run(() =>
            {
                Application.Current.Dispatcher.Invoke(async () =>
                {
                    while (!cancellationTokenSource.IsCancellationRequested)
                    {
                        await Task.Delay(1000);
                        if (!_centerService.Equipments.Where(x => x.Id == EquipmentId).Any())
                        {
                            continue;
                        }

                        var temps = EquipmentPropList.ToList();
                        foreach (var item in temps)
                        {
                            var prop = _centerService.Equipments.SelectMany(x => x.EquipmentProps).Where(x => x.Id == item.Id).FirstOrDefault();
                            if (prop == null)
                            {
                                continue;
                            }
                            item.Value = prop.Value;
                            item.Updated = prop.Updated;
                        }
                        EquipmentPropList = null;
                        EquipmentPropList = new ObservableCollection<EquipmentPropExtend>(temps);
                    }
                }, DispatcherPriority.Background);
            }, cancellationTokenSource.Token);
        }
    }
}