using AutoMapper;
using CapMachine.Core;
using CapMachine.Model.CANLIN;
using CapMachine.Wpf.Dtos;
using CapMachine.Wpf.LinDrive;
using CapMachine.Wpf.Services;
using CapMachine.Wpf.Views;
using ImTools;
using Microsoft.Win32;
using Prism.Commands;
using Prism.Events;
using Prism.Regions;
using Prism.Services.Dialogs;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using static CapMachine.Wpf.Models.ComEnum;
namespace CapMachine.Wpf.ViewModels
{
///
/// ZLG LIN 配置 ViewModel。
///
public class ZlgLinDriveConfigViewModel : NavigationViewModel
{
///
/// 构造函数。
///
public ZlgLinDriveConfigViewModel(IDialogService dialogService, IFreeSql freeSql,
IEventAggregator eventAggregator, IRegionManager regionManager, SysRunService sysRunService,
ConfigService configService, ZlgLinDriveService zlgLinDriveService, ZlgCanDriveService zlgCanDriveService,
ComActionService comActionService, LogicRuleService logicRuleService,
IMapper mapper)
{
DialogService = dialogService;
FreeSql = freeSql;
EventAggregator = eventAggregator;
RegionManager = regionManager;
SysRunService = sysRunService;
ConfigService = configService;
ZlgLinDriveService = zlgLinDriveService;
ZlgCanDriveService = zlgCanDriveService;
ComActionService = comActionService;
LogicRuleService = logicRuleService;
Mapper = mapper;
InitLoadLinConfigPro();
}
public IDialogService DialogService { get; }
public IFreeSql FreeSql { get; }
public IEventAggregator EventAggregator { get; }
public IRegionManager RegionManager { get; }
public SysRunService SysRunService { get; }
public ConfigService ConfigService { get; }
public ZlgLinDriveService ZlgLinDriveService { get; }
public ZlgCanDriveService ZlgCanDriveService { get; }
public ComActionService ComActionService { get; }
public LogicRuleService LogicRuleService { get; }
public IMapper Mapper { get; }
private List linConfigPros = new List();
private ObservableCollection? _ListCanLinConfigPro;
///
/// LIN 配置程序集合。
///
public ObservableCollection? ListCanLinConfigPro
{
get { return _ListCanLinConfigPro; }
set { _ListCanLinConfigPro = value; RaisePropertyChanged(); }
}
///
/// 选中的配置程序。
///
public CanLinConfigPro? SelectCanLinConfigPro { get; set; }
private ObservableCollection _listWriteCanLinRWConfigDto = new ObservableCollection();
public ObservableCollection ListWriteCanLinRWConfigDto
{
get { return _listWriteCanLinRWConfigDto; }
set { _listWriteCanLinRWConfigDto = value; RaisePropertyChanged(); }
}
private ObservableCollection _listReadCanLinRWConfigDto = new ObservableCollection();
public ObservableCollection ListReadCanLinRWConfigDto
{
get { return _listReadCanLinRWConfigDto; }
set { _listReadCanLinRWConfigDto = value; RaisePropertyChanged(); }
}
public bool IsRwEditable
{
get { return !ZlgLinDriveService.OpenState; }
}
private LINConfigExdDto? _SelectedLINConfigExdDto;
///
/// 选中的 LIN 配置 DTO。
///
public LINConfigExdDto? SelectedLINConfigExdDto
{
get { return _SelectedLINConfigExdDto; }
set { _SelectedLINConfigExdDto = value; RaisePropertyChanged(); RaisePropertyChanged(nameof(CurrentLdfPath)); RaisePropertyChanged(nameof(CurrentSchEnable)); RaisePropertyChanged(nameof(LinBaudRate)); }
}
///
/// 当前 LDF 路径。
///
public string? CurrentLdfPath
{
get { return SelectedLINConfigExdDto?.LdfPath; }
set
{
if (SelectedLINConfigExdDto == null) return;
SelectedLINConfigExdDto.LdfPath = value;
RaisePropertyChanged();
}
}
///
/// LIN 波特率。
///
public int LinBaudRate
{
get { return SelectedLINConfigExdDto?.BaudRate ?? 0; }
set
{
if (SelectedLINConfigExdDto == null) return;
SelectedLINConfigExdDto.BaudRate = value;
RaisePropertyChanged();
}
}
///
/// 调度表使能。
///
public bool CurrentSchEnable
{
get { return SelectedLINConfigExdDto?.SchEnable ?? false; }
set
{
if (SelectedLINConfigExdDto == null) return;
SelectedLINConfigExdDto.SchEnable = value;
RaisePropertyChanged();
}
}
private void InitLoadLinConfigPro()
{
linConfigPros = FreeSql.Select()
.Where(a => a.CANLINInfo == CANLIN.LIN)
.Include(a => a.LINConfigExd)
.IncludeMany(a => a.CanLinConfigContents, then => then.Include(b => b.LogicRule))
.IncludeMany(a => a.LinScheduleConfigs)
.ToList();
ListCanLinConfigPro = new ObservableCollection(linConfigPros);
}
private void SyncSelectedConfig()
{
if (SelectCanLinConfigPro == null) return;
SelectedLINConfigExdDto = Mapper.Map(SelectCanLinConfigPro.LINConfigExd);
var writeData = SelectCanLinConfigPro.CanLinConfigContents?.Where(a => a.RWInfo == RW.Write).ToList() ?? new List();
ListWriteCanLinRWConfigDto = new ObservableCollection(Mapper.Map>(writeData));
var readData = SelectCanLinConfigPro.CanLinConfigContents?.Where(a => a.RWInfo == RW.Read).ToList() ?? new List();
ListReadCanLinRWConfigDto = new ObservableCollection(Mapper.Map>(readData));
RaisePropertyChanged(nameof(IsRwEditable));
}
private DelegateCommand