359 lines
12 KiB
C#
359 lines
12 KiB
C#
using AutoMapper;
|
||
using CapMachine.Core;
|
||
using CapMachine.Model.CANLIN;
|
||
using CapMachine.Wpf.Dtos;
|
||
using Prism.Commands;
|
||
using Prism.Services.Dialogs;
|
||
using System;
|
||
using System.Collections.Generic;
|
||
using System.Collections.ObjectModel;
|
||
using System.Linq;
|
||
using System.Windows;
|
||
|
||
namespace CapMachine.Wpf.ViewModels
|
||
{
|
||
/// <summary>
|
||
/// ZLG CAN FD 调度表配置弹窗 ViewModel。
|
||
/// 说明:
|
||
/// - 调度表项本身由“读写设置”弹窗中的“加入定时调度表”能力生成,这里主要负责:
|
||
/// 1) 设置发送方式(并行/顺序)
|
||
/// 2) 配置周期(Cycle)
|
||
/// 3) 删除与保存落库
|
||
/// - 保存时会使用 InsertOrUpdate 做 Upsert,并在保存完成后从数据库重载,作为权威数据再回传给调用方。
|
||
/// </summary>
|
||
public class DialogZlgCANFDSchConfigViewModel : DialogViewModel
|
||
{
|
||
/// <summary>
|
||
/// 构造函数。
|
||
/// </summary>
|
||
/// <param name="freeSql">FreeSql。</param>
|
||
/// <param name="mapper">AutoMapper。</param>
|
||
public DialogZlgCANFDSchConfigViewModel(IFreeSql freeSql, IMapper mapper)
|
||
{
|
||
Title = "调度表 CANFD 配置";
|
||
FreeSql = freeSql;
|
||
Mapper = mapper;
|
||
|
||
SendOrderCbxItems = new ObservableCollection<CbxItems>()
|
||
{
|
||
new CbxItems(){
|
||
Key="0",
|
||
Text="并行",
|
||
},
|
||
new CbxItems(){
|
||
Key="1",
|
||
Text="顺序",
|
||
},
|
||
};
|
||
|
||
SchTabIndexCbxItems = new ObservableCollection<CbxItems>()
|
||
{
|
||
new CbxItems(){
|
||
Key="0",
|
||
Text="0",
|
||
},
|
||
};
|
||
}
|
||
|
||
/// <summary>
|
||
/// FreeSql。
|
||
/// </summary>
|
||
public IFreeSql FreeSql { get; }
|
||
|
||
/// <summary>
|
||
/// AutoMapper。
|
||
/// </summary>
|
||
public IMapper Mapper { get; }
|
||
|
||
private ObservableCollection<CANFdScheduleConfigDto> _listCANFdScheduleConfigDto = new ObservableCollection<CANFdScheduleConfigDto>();
|
||
|
||
/// <summary>
|
||
/// CAN FD 调度表数据集合。
|
||
/// </summary>
|
||
public ObservableCollection<CANFdScheduleConfigDto> ListCANFdScheduleConfigDto
|
||
{
|
||
get { return _listCANFdScheduleConfigDto; }
|
||
set { _listCANFdScheduleConfigDto = value; RaisePropertyChanged(); }
|
||
}
|
||
|
||
/// <summary>
|
||
/// 消息名列表。
|
||
/// </summary>
|
||
public List<string>? ListMsg { get; set; }
|
||
|
||
private ObservableCollection<CbxItems> _msgCbxItems;
|
||
|
||
/// <summary>
|
||
/// 消息名称下拉框数据。
|
||
/// </summary>
|
||
public ObservableCollection<CbxItems> MsgCbxItems
|
||
{
|
||
get { return _msgCbxItems; }
|
||
set { _msgCbxItems = value; RaisePropertyChanged(); }
|
||
}
|
||
|
||
/// <summary>
|
||
/// 选中的程序 Id。
|
||
/// </summary>
|
||
public long SelectCanLinConfigProId { get; set; }
|
||
|
||
private ObservableCollection<CbxItems> _sendOrderCbxItems;
|
||
|
||
/// <summary>
|
||
/// 发送方式集合。
|
||
/// </summary>
|
||
public ObservableCollection<CbxItems> SendOrderCbxItems
|
||
{
|
||
get { return _sendOrderCbxItems; }
|
||
set { _sendOrderCbxItems = value; RaisePropertyChanged(); }
|
||
}
|
||
|
||
private string? _curSendOrder;
|
||
|
||
/// <summary>
|
||
/// 当前发送方式。
|
||
/// </summary>
|
||
public string? CurSendOrder
|
||
{
|
||
get { return _curSendOrder; }
|
||
set { _curSendOrder = value; RaisePropertyChanged(); }
|
||
}
|
||
|
||
private ObservableCollection<CbxItems> _schTabIndexCbxItems;
|
||
|
||
/// <summary>
|
||
/// 调度器序号集合。
|
||
/// </summary>
|
||
public ObservableCollection<CbxItems> SchTabIndexCbxItems
|
||
{
|
||
get { return _schTabIndexCbxItems; }
|
||
set { _schTabIndexCbxItems = value; RaisePropertyChanged(); }
|
||
}
|
||
|
||
private CANFdScheduleConfigDto _curSelectedItem;
|
||
|
||
/// <summary>
|
||
/// 当前选中项。
|
||
/// </summary>
|
||
public CANFdScheduleConfigDto CurSelectedItem
|
||
{
|
||
get { return _curSelectedItem; }
|
||
set { _curSelectedItem = value; RaisePropertyChanged(); }
|
||
}
|
||
|
||
private DelegateCommand<object> _gridSelectionChangedCmd;
|
||
|
||
/// <summary>
|
||
/// DataGrid 选中行变化。
|
||
/// </summary>
|
||
public DelegateCommand<object> GridSelectionChangedCmd
|
||
{
|
||
get
|
||
{
|
||
if (_gridSelectionChangedCmd == null)
|
||
{
|
||
_gridSelectionChangedCmd = new DelegateCommand<object>(GridSelectionChangedCmdMethod);
|
||
}
|
||
return _gridSelectionChangedCmd;
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 选中行变化处理。
|
||
/// </summary>
|
||
/// <param name="par">选中项。</param>
|
||
private void GridSelectionChangedCmdMethod(object par)
|
||
{
|
||
var selected = par as CANFdScheduleConfigDto;
|
||
if (selected != null)
|
||
{
|
||
CurSelectedItem = selected;
|
||
}
|
||
}
|
||
|
||
private DelegateCommand<string> _opCmd;
|
||
|
||
/// <summary>
|
||
/// 操作命令(删除)。
|
||
/// </summary>
|
||
public DelegateCommand<string> OpCmd
|
||
{
|
||
get
|
||
{
|
||
if (_opCmd == null)
|
||
{
|
||
_opCmd = new DelegateCommand<string>(OpCmdCall);
|
||
}
|
||
return _opCmd;
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 操作命令处理。
|
||
/// </summary>
|
||
/// <param name="par">参数。</param>
|
||
private void OpCmdCall(string par)
|
||
{
|
||
switch (par)
|
||
{
|
||
case "Add":
|
||
MessageBox.Show("调度表项由【读写设置】中的写入配置通过“加入定时调度表”生成,这里不支持新增。", "提示", MessageBoxButton.OK, MessageBoxImage.Hand);
|
||
break;
|
||
case "Delete":
|
||
if (CurSelectedItem != null)
|
||
{
|
||
FreeSql.Delete<CANFdScheduleConfig>(CurSelectedItem.Id).ExecuteAffrows();
|
||
ListCANFdScheduleConfigDto.Remove(CurSelectedItem);
|
||
CurSelectedItem = null;
|
||
}
|
||
else
|
||
{
|
||
MessageBox.Show("请选中后再进行【删除】操作?", "提示", MessageBoxButton.OK, MessageBoxImage.Hand);
|
||
}
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
}
|
||
|
||
private DelegateCommand _saveCmd;
|
||
|
||
/// <summary>
|
||
/// 保存命令。
|
||
/// </summary>
|
||
public DelegateCommand SaveCmd
|
||
{
|
||
get
|
||
{
|
||
if (_saveCmd == null)
|
||
{
|
||
_saveCmd = new DelegateCommand(SaveCmdMethod);
|
||
}
|
||
return _saveCmd;
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 保存命令处理。
|
||
/// </summary>
|
||
private void SaveCmdMethod()
|
||
{
|
||
// 校验:确保每个调度项具备最小可用字段,避免落库无效配置。
|
||
foreach (var item in ListCANFdScheduleConfigDto)
|
||
{
|
||
// UI 上的“发送方式”是全局下拉框,这里同步写回每个子项,确保落库数据一致。
|
||
item.OrderSend = CurSendOrder == "0" ? 0 : 1;
|
||
|
||
if (string.IsNullOrEmpty(item.MsgName))
|
||
{
|
||
MessageBox.Show("消息名为空:请在【读写设置】-> 写入配置中选择报文后点击“加入定时调度表”,再回到此处设置周期。", "提示", MessageBoxButton.OK, MessageBoxImage.Hand);
|
||
return;
|
||
}
|
||
|
||
if (item.Cycle <= 0)
|
||
{
|
||
MessageBox.Show("请确认周期是否正确", "提示", MessageBoxButton.OK, MessageBoxImage.Hand);
|
||
return;
|
||
}
|
||
|
||
if (item.OrderSend >= 2)
|
||
{
|
||
MessageBox.Show("请确认发送方式是否正确", "提示", MessageBoxButton.OK, MessageBoxImage.Hand);
|
||
return;
|
||
}
|
||
}
|
||
|
||
foreach (var item in ListCANFdScheduleConfigDto)
|
||
{
|
||
// Upsert:逐项落库。
|
||
FreeSql.InsertOrUpdate<CANFdScheduleConfig>()
|
||
.SetSource(Mapper.Map<CANFdScheduleConfig>(item))
|
||
.ExecuteAffrows();
|
||
}
|
||
|
||
// 保存完成后重载:
|
||
// - 避免 UI 集合与数据库实际数据不一致;
|
||
// - 同时让新增项获取真实 Id。
|
||
ListCANFdScheduleConfigDto = new ObservableCollection<CANFdScheduleConfigDto>(
|
||
Mapper.Map<List<CANFdScheduleConfigDto>>(
|
||
FreeSql.Select<CANFdScheduleConfig>()
|
||
.Where(a => a.CanLinConfigProId == SelectCanLinConfigProId)
|
||
.ToList()));
|
||
|
||
DialogParameters pars = new DialogParameters
|
||
{
|
||
{ "ReturnValue", ListCANFdScheduleConfigDto }
|
||
};
|
||
|
||
RaiseRequestClose(new DialogResult(ButtonResult.OK, pars));
|
||
}
|
||
|
||
private DelegateCommand _cancelCmd;
|
||
|
||
/// <summary>
|
||
/// 取消命令。
|
||
/// </summary>
|
||
public DelegateCommand CancelCmd
|
||
{
|
||
get
|
||
{
|
||
if (_cancelCmd == null)
|
||
{
|
||
_cancelCmd = new DelegateCommand(CancelCmdMethod);
|
||
}
|
||
return _cancelCmd;
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 取消命令处理。
|
||
/// </summary>
|
||
private void CancelCmdMethod()
|
||
{
|
||
RaiseRequestClose(new DialogResult(ButtonResult.Cancel));
|
||
}
|
||
|
||
/// <summary>
|
||
/// 弹窗打开时参数接收并初始化 UI。
|
||
/// 说明:
|
||
/// - ListMsg:用于构造消息名下拉框(候选);
|
||
/// - ListCANFdScheduleConfigDto:用于回显当前调度表;
|
||
/// - SelectCanLinConfigProId:用于 Save 后按配置程序 id 重载。
|
||
/// </summary>
|
||
/// <param name="parameters">参数。</param>
|
||
public override void OnDialogOpened(IDialogParameters parameters)
|
||
{
|
||
if (parameters.ContainsKey("ListMsg"))
|
||
{
|
||
ListMsg = parameters.GetValue<List<string>>("ListMsg");
|
||
if (ListMsg != null)
|
||
{
|
||
// 转换为 CbxItems 集合(Key/Text 都使用消息名)。
|
||
MsgCbxItems = new ObservableCollection<CbxItems>(
|
||
ListMsg.Select(value => new CbxItems
|
||
{
|
||
Key = value,
|
||
Text = value
|
||
}));
|
||
}
|
||
}
|
||
|
||
ListCANFdScheduleConfigDto = parameters.GetValue<ObservableCollection<CANFdScheduleConfigDto>>("ListCANFdScheduleConfigDto");
|
||
if (ListCANFdScheduleConfigDto == null) ListCANFdScheduleConfigDto = new ObservableCollection<CANFdScheduleConfigDto>();
|
||
|
||
if (ListCANFdScheduleConfigDto.Count > 0)
|
||
{
|
||
// 回显:默认取第一条的 OrderSend。
|
||
CurSendOrder = ListCANFdScheduleConfigDto.FirstOrDefault()!.OrderSend.ToString();
|
||
}
|
||
else
|
||
{
|
||
// 默认:顺序发送。
|
||
CurSendOrder = "1";
|
||
}
|
||
|
||
SelectCanLinConfigProId = parameters.GetValue<long>("SelectCanLinConfigProId");
|
||
}
|
||
}
|
||
}
|