using AutoMapper;
using CapMachine.Core;
using CapMachine.Model.CANLIN;
using CapMachine.Wpf.Dtos;
using CapMachine.Wpf.LinDrive;
using CapMachine.Wpf.PrismEvent;
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;
EventAggregator.GetEvent().Subscribe(CanLinConfigChangedEventCall);
InitLoadLinConfigPro();
}
///
/// CAN/LIN 配置导入后刷新当前页面。
///
/// 事件消息。
private void CanLinConfigChangedEventCall(string msg)
{
ReloadCurrentConfigPro();
}
///
/// Prism 弹窗服务。
///
public IDialogService DialogService { get; }
///
/// FreeSql(用于 LIN 配置程序/读写项/调度表 的查询与持久化)。
///
public IFreeSql FreeSql { get; }
///
/// 事件聚合器。
///
public IEventAggregator EventAggregator { get; }
///
/// 区域管理器。
///
public IRegionManager RegionManager { get; }
///
/// 系统运行状态服务。
///
public SysRunService SysRunService { get; }
///
/// 全局配置服务(用于记录当前系统选择的通信类型等状态)。
///
public ConfigService ConfigService { get; }
///
/// ZLG LIN 服务(LIN 生命周期、LDF 解析、软件调度、收发指示灯等)。
///
public ZlgLinDriveService ZlgLinDriveService { get; }
///
/// ZLG CAN 服务。
/// 说明:LIN 与 CAN 共用同一硬件/设备句柄,打开 LIN 前需要确保 CAN 已关闭。
///
public ZlgCanDriveService ZlgCanDriveService { get; }
///
/// 通信驱动互斥控制服务(同一时刻只能有一种驱动操作压缩机)。
///
public ComActionService ComActionService { get; }
///
/// 逻辑规则服务。
///
public LogicRuleService LogicRuleService { get; }
///
/// AutoMapper。
///
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();
///
/// 写入配置 DTO 集合(UI 展示/编辑用)。
///
public ObservableCollection ListWriteCanLinRWConfigDto
{
get { return _listWriteCanLinRWConfigDto; }
set { _listWriteCanLinRWConfigDto = value; RaisePropertyChanged(); }
}
private ObservableCollection _listReadCanLinRWConfigDto = new ObservableCollection();
///
/// 读取配置 DTO 集合(UI 展示/编辑用)。
///
public ObservableCollection ListReadCanLinRWConfigDto
{
get { return _listReadCanLinRWConfigDto; }
set { _listReadCanLinRWConfigDto = value; RaisePropertyChanged(); }
}
private ObservableCollection _listLINScheduleConfigDto = new ObservableCollection();
///
/// LIN 调度表集合(系统层)。
///
public ObservableCollection ListLINScheduleConfigDto
{
get { return _listLINScheduleConfigDto; }
set { _listLINScheduleConfigDto = value; RaisePropertyChanged(); }
}
private bool _isLinConfigProActive;
///
/// 当前配置程序是否已激活(对齐 CAN Active 语义)。激活后禁止切换配置程序。
///
public bool IsLinConfigProActive
{
get { return _isLinConfigProActive; }
set
{
_isLinConfigProActive = value;
RaisePropertyChanged();
RaisePropertyChanged(nameof(IsRwEditable));
}
}
private bool _isLINConfigDatagridActive = true;
///
/// 配置程序 DataGrid 是否可操作(与 IsLinConfigProActive 取反)。
///
public bool IsLINConfigDatagridActive
{
get { return _isLINConfigDatagridActive; }
set { _isLINConfigDatagridActive = value; RaisePropertyChanged(); }
}
///
/// 读写设置是否允许编辑。
/// 说明:与 语义绑定:激活后代表“配置已下发并进入运行态”,因此禁止编辑配置/切换配置程序。
///
public bool IsRwEditable
{
get { return !IsLinConfigProActive; }
}
private LINConfigExdDto? _SelectedLINConfigExdDto;
///
/// 选中的 LIN 配置 DTO。
///
public LINConfigExdDto? SelectedLINConfigExdDto
{
get { return _SelectedLINConfigExdDto; }
set
{
_SelectedLINConfigExdDto = value;
RaisePropertyChanged();
// SelectedLINConfigExdDto 变更时,需要同步刷新其映射的“派生属性”(都是 UI 绑定入口)。
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();
}
}
///
/// 循环周期(ms)。
///
public int CurrentCycle
{
get { return SelectedLINConfigExdDto?.Cycle ?? 0; }
set
{
if (SelectedLINConfigExdDto == null) return;
SelectedLINConfigExdDto.Cycle = value;
RaisePropertyChanged();
}
}
///
/// 连接按钮文字。
///
public string ConnectButtonText
{
get { return "连接LIN"; }
}
///
/// 关闭按钮文字。
///
public string CloseButtonText
{
get { return "关闭LIN"; }
}
///
/// 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()
{
// 从数据库加载 LIN 配置程序:
// - 同时 include 扩展配置、读写项(含逻辑规则)、调度表
// - 供主界面 DataGrid 与右侧配置区域绑定
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;
// 实体 -> DTO:
// - DTO 用于 UI 编辑(双向绑定);
// - 保存时再由 VM 负责落库;
// - 激活时则以 DTO/当前列表为准,下发到 Service(避免直接引用数据库实体导致并发/脏写)。
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));
var schData = SelectCanLinConfigPro.LinScheduleConfigs?.ToList() ?? new List();
ListLINScheduleConfigDto = new ObservableCollection(Mapper.Map>(schData));
// 触发依赖属性刷新:IsRwEditable 与 CurrentCycle 取决于当前选择的配置与激活状态。
RaisePropertyChanged(nameof(IsRwEditable));
RaisePropertyChanged(nameof(CurrentCycle));
}
private DelegateCommand