You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
276 lines
6.8 KiB
276 lines
6.8 KiB
3 years ago
|
using EC.Entity.CameraInfo;
|
||
|
using EC.Service.CameraInfo;
|
||
|
using ECMonitor.Code.Models;
|
||
|
using ECMonitor.MVVM;
|
||
|
using Prism.Commands;
|
||
|
using Prism.Events;
|
||
|
using Prism.Regions;
|
||
|
using System;
|
||
|
using System.Collections.Generic;
|
||
|
using System.Collections.ObjectModel;
|
||
|
using System.Threading;
|
||
|
using System.Windows.Controls;
|
||
|
|
||
|
namespace ECMonitor.Page.SystemSet
|
||
|
{
|
||
|
public class ManageNvrViewModel : BaseModel
|
||
|
{
|
||
|
private ManageNvr ThatPage { get; set; }
|
||
|
|
||
|
public ObservableCollection<NvrInfo> InfoList { get; set; } = new();
|
||
|
|
||
|
private ReaderWriterLockSlim InfoListrwl { get; } = new();
|
||
|
|
||
|
private List<int> AddNumberList { get; } = new();
|
||
|
|
||
|
private List<int> UpdateNumberList { get; } = new();
|
||
|
|
||
|
public ObservableCollection<string> NvrDeviceList { get; set; } = new();
|
||
|
|
||
|
#region Command
|
||
|
|
||
|
public DelegateCommand<UserControl> LoadedCommand { get; private set; }
|
||
|
|
||
|
public DelegateCommand<DataGrid> LoadedCommand2 { get; private set; }
|
||
|
|
||
|
public DelegateCommand AddCommand { get; private set; }
|
||
|
|
||
|
public DelegateCommand DeleteCommand { get; private set; }
|
||
|
|
||
|
public ExtendCommand<DataGridCellEditEndingEventArgs> UpdateCommand { get; private set; }
|
||
|
|
||
|
public DelegateCommand SaveCommand { get; private set; }
|
||
|
|
||
|
public DelegateCommand RevokeCommand { get; private set; }
|
||
|
|
||
|
public DelegateCommand RefreshCommand { get; private set; }
|
||
|
|
||
|
public DelegateCommand ImportCommand { get; private set; }
|
||
|
|
||
|
public DelegateCommand ExportCommand { get; private set; }
|
||
|
|
||
|
#endregion Command
|
||
|
|
||
|
public ManageNvrViewModel(IRegionManager regionManager, IEventAggregator ea) : base(regionManager, ea)
|
||
|
{
|
||
|
LoadedCommand = new DelegateCommand<UserControl>(LoadedPageAction);
|
||
|
|
||
|
AddCommand = new DelegateCommand(AddInfoAction);
|
||
|
DeleteCommand = new DelegateCommand(DeleteInfoAction);
|
||
|
UpdateCommand = new ExtendCommand<DataGridCellEditEndingEventArgs>(UpdateInfoAction);
|
||
|
SaveCommand = new DelegateCommand(SaveInfosAction);
|
||
|
RevokeCommand = new DelegateCommand(RevokeInfoAction);
|
||
|
RefreshCommand = new DelegateCommand(RefreshAction);
|
||
|
ImportCommand = new DelegateCommand(ImportInfosAction);
|
||
|
ExportCommand = new DelegateCommand(ExportInfosAction);
|
||
|
}
|
||
|
|
||
|
#region Event Action
|
||
|
|
||
|
private void LoadedPageAction(UserControl view)
|
||
|
{
|
||
|
if (ThatPage != null) { return; }
|
||
|
ThatPage = (ManageNvr)view;
|
||
|
RefreshAction();
|
||
|
}
|
||
|
|
||
|
#endregion Event Action
|
||
|
|
||
|
#region Operate Action
|
||
|
|
||
|
private void AddInfoAction()
|
||
|
{
|
||
|
NvrInfo info = new();
|
||
|
info.Number = GetInfoNewNumber();
|
||
|
info.NvrName = $"录像机#{info.Number}";
|
||
|
info.NvrEnableBool = true;
|
||
|
OperateInfoListByLock(() => { AddInfo(info); });
|
||
|
|
||
|
DataGrid infoGrid = ThatPage.InfoGrid;
|
||
|
infoGrid.SelectedIndex = infoGrid.Items.Count - 1;
|
||
|
}
|
||
|
|
||
|
private async void DeleteInfoAction()
|
||
|
{
|
||
|
DataGrid infoGrid = ThatPage.InfoGrid;
|
||
|
NvrInfo info = (NvrInfo)infoGrid.SelectedItem;
|
||
|
int index = infoGrid.SelectedIndex;
|
||
|
if (info == null) { return; }
|
||
|
|
||
|
if (info.NvrId <= 0)
|
||
|
{
|
||
|
OperateInfoListByLock(() => { RemoveInfo(info); });
|
||
|
infoGrid.SelectedIndex = (index < infoGrid.Items.Count) ? index : infoGrid.Items.Count - 1;
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
int ret = 0;
|
||
|
using IpcInfoContext ctx1 = new();
|
||
|
List<IpcInfo> ipcInfoList = await ctx1.GetListAsync();
|
||
|
ipcInfoList.ForEach(ipc => { if (ipc.NvrName.Equals(info.NvrName)) { ctx1.Remove(ipc); } });
|
||
|
ret = await ctx1.SaveChangesAsync();
|
||
|
if (ret > 0)
|
||
|
{
|
||
|
using NvrInfoContext ctx2 = new();
|
||
|
_ = ctx2.Remove(info);
|
||
|
ret = await ctx2.SaveChangesAsync();
|
||
|
if (ret > 0)
|
||
|
{
|
||
|
OperateInfoListByLock(() => { RemoveInfo(info); });
|
||
|
infoGrid.SelectedIndex = (index < infoGrid.Items.Count) ? index : infoGrid.Items.Count - 1;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private void UpdateInfoAction(DataGridCellEditEndingEventArgs e)
|
||
|
{
|
||
|
if (e.EditAction != DataGridEditAction.Commit) { return; }
|
||
|
|
||
|
var elm = e.EditingElement;
|
||
|
DataGridRow row = e.Row;
|
||
|
DataGridColumn column = e.Column;
|
||
|
NvrInfo info = (NvrInfo)row.Item;
|
||
|
if (info != null && info.NvrId > 0)
|
||
|
{
|
||
|
if (!UpdateNumberList.Exists(item => item.Equals(info.Number)))
|
||
|
{
|
||
|
UpdateNumberList.Add(info.Number);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private async void SaveInfosAction()
|
||
|
{
|
||
|
//ValidationError validationError = WPFAssist.GetDataGridRowsFirstError(ThatPage.InfoGrid);
|
||
|
//if (WPFAssist.GetDataGridRowsHasError(ThatPage.InfoGrid)) { return; }
|
||
|
|
||
|
List<NvrInfo> list = null;
|
||
|
using NvrInfoContext ctx = new();
|
||
|
int ret = 0;
|
||
|
|
||
|
if (AddNumberList.Count > 0)
|
||
|
{
|
||
|
list ??= GetInfoList();
|
||
|
foreach (int number in AddNumberList)
|
||
|
{
|
||
|
NvrInfo info = list.Find(item => item.Number.Equals(number));
|
||
|
if (info != null) { _ = ctx.Add(info); }
|
||
|
}
|
||
|
ret = await ctx.SaveChangesAsync();
|
||
|
if (ret > 0) { AddNumberList.Clear(); }
|
||
|
else { return; }
|
||
|
}
|
||
|
|
||
|
if (UpdateNumberList.Count > 0)
|
||
|
{
|
||
|
list ??= GetInfoList();
|
||
|
foreach (int number in UpdateNumberList)
|
||
|
{
|
||
|
NvrInfo info = list.Find(item => item.Number.Equals(number));
|
||
|
if (info != null) { _ = ctx.Update(info); }
|
||
|
}
|
||
|
ret = await ctx.SaveChangesAsync();
|
||
|
if (ret > 0) { UpdateNumberList.Clear(); }
|
||
|
else { return; }
|
||
|
}
|
||
|
|
||
|
RefreshAction();
|
||
|
}
|
||
|
|
||
|
private void RevokeInfoAction()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
private void RefreshAction()
|
||
|
{
|
||
|
OperateInfoListByLock(() =>
|
||
|
{
|
||
|
AddNumberList.Clear();
|
||
|
UpdateNumberList.Clear();
|
||
|
|
||
|
LoadNvrDeviceList();
|
||
|
LoadInfoList();
|
||
|
});
|
||
|
}
|
||
|
|
||
|
private void ImportInfosAction()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
private void ExportInfosAction()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
#endregion Operate Action
|
||
|
|
||
|
#region Operate InfoList
|
||
|
|
||
|
private void OperateInfoListByLock(Action action)
|
||
|
{
|
||
|
if (InfoListrwl.IsWriteLockHeld) { return; }
|
||
|
if (!InfoListrwl.TryEnterWriteLock(100)) { return; }
|
||
|
try
|
||
|
{
|
||
|
action?.Invoke();
|
||
|
}
|
||
|
finally
|
||
|
{
|
||
|
InfoListrwl.ExitWriteLock();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private async void LoadInfoList()
|
||
|
{
|
||
|
InfoList.Clear();
|
||
|
using NvrInfoContext ctx = new();
|
||
|
List<NvrInfo> list = await ctx.GetListAsync();
|
||
|
int number = 0;
|
||
|
foreach (NvrInfo info in list)
|
||
|
{
|
||
|
info.Number = ++number;
|
||
|
InfoList.Add(info);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private void AddInfo(NvrInfo info)
|
||
|
{
|
||
|
InfoList.Add(info);
|
||
|
if (!AddNumberList.Exists(item => item.Equals(info.Number)))
|
||
|
{
|
||
|
AddNumberList.Add(info.Number);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private void RemoveInfo(NvrInfo info)
|
||
|
{
|
||
|
_ = InfoList.Remove(info);
|
||
|
_ = AddNumberList.RemoveAll(item => item.Equals(info.Number));
|
||
|
_ = UpdateNumberList.RemoveAll(item => item.Equals(info.Number));
|
||
|
}
|
||
|
|
||
|
private List<NvrInfo> GetInfoList()
|
||
|
{
|
||
|
return new(InfoList);
|
||
|
}
|
||
|
|
||
|
private int GetInfoNewNumber()
|
||
|
{
|
||
|
int number = InfoList.Count > 0 ? InfoList[^1].Number + 1 : 1;
|
||
|
return number;
|
||
|
}
|
||
|
|
||
|
#endregion Operate InfoList
|
||
|
|
||
|
#region Operate OtherList
|
||
|
|
||
|
private void LoadNvrDeviceList()
|
||
|
{
|
||
|
NvrDeviceList.Clear();
|
||
|
using NvrInfoContext ctx = new();
|
||
|
List<string> list = ctx.GetNvrDeviceList();
|
||
|
list.ForEach(item => { NvrDeviceList.Add(item); });
|
||
|
}
|
||
|
|
||
|
#endregion Operate OtherList
|
||
|
}
|
||
|
}
|