兼容win7版应用
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.

357 lines
11 KiB

using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
namespace AIK.ViewModels.IDCardCopy;
public partial class AccessCardCopy : ObservableObject
{
[ObservableProperty]
private string _deviceStatus = "设备已连接";
[ObservableProperty]
private string _readerStatus = "待机";
[ObservableProperty]
private string _currentMode = "IC/ID 自动识别";
[ObservableProperty]
private string _actionHint = "点击“开始识别”读取原卡信息,或直接查看设备待机状态。";
[ObservableProperty]
private bool _isCopyEnabled;
[ObservableProperty]
private bool _isBusy;
[ObservableProperty]
private CardInfoItem _sourceCard = CreateSourcePlaceholder();
[ObservableProperty]
private CardInfoItem _targetCard = CreateTargetPlaceholder();
public ObservableCollection<SectorBlockRowItem> SectorBlockRows { get; } = new();
public ObservableCollection<SectorContentItem> SourceSectorContents { get; } = new();
public ObservableCollection<SectorContentItem> TargetSectorContents { get; } = new();
public ObservableCollection<OperationLogItem> Logs { get; } = new();
public AccessCardCopy()
{
ResetSectorContents();
ResetSectorBlockRows();
AppendLog("页面已加载,设备待机中。");
}
[RelayCommand]
private void Identify()
{
IsBusy = true;
ReaderStatus = "识别中";
ActionHint = "请将原卡放置在左侧识别区域附近。";
AppendLog("开始识别原卡。");
SourceCard = new CardInfoItem
{
Title = "原卡信息",
CardType = "IC 卡",
CardNumber = "04 A2 7F 19",
Uid = "8F 23 91 C0",
Protocol = "Mifare 1K",
Frequency = "13.56 MHz",
SectorCount = "16",
WritableStatus = "可复制",
CurrentStatus = "识别成功"
};
ReplaceSectorContents(SourceSectorContents, CreateSourceSectorContents());
ReplaceSectorContents(TargetSectorContents, CreateTargetSectorPlaceholders());
ReaderStatus = "等待目标卡";
ActionHint = "原卡识别完成,当前可放入目标卡并点击“开始拷贝”。";
IsCopyEnabled = true;
IsBusy = false;
AppendLog("原卡识别成功,可进入拷贝流程。");
}
[RelayCommand]
private void Copy()
{
if (!IsCopyEnabled)
{
AppendLog("未识别原卡,拷贝操作已忽略。");
return;
}
IsBusy = true;
ReaderStatus = "写入中";
ActionHint = "请保持目标卡稳定,系统正在模拟写入。";
AppendLog("检测到目标卡,开始写入。");
TargetCard = new CardInfoItem
{
Title = "目标卡信息",
CardType = SourceCard.CardType,
CardNumber = SourceCard.CardNumber,
Uid = SourceCard.Uid,
Protocol = SourceCard.Protocol,
Frequency = SourceCard.Frequency,
SectorCount = SourceCard.SectorCount,
WritableStatus = "已写入",
CurrentStatus = "写入成功"
};
ReplaceSectorContents(TargetSectorContents, CreateTargetSectorContents());
ActionHint = "拷贝完成,可继续识别下一张卡或清空当前数据。";
ReaderStatus = "完成";
IsBusy = false;
AppendLog("目标卡写入成功,拷贝完成。");
}
[RelayCommand]
private void Swap()
{
var source = SourceCard.Clone();
var sourceSectors = CloneSectorContents(SourceSectorContents);
var targetSectors = CloneSectorContents(TargetSectorContents);
SourceCard = TargetCard.Clone();
TargetCard = source;
SourceCard.Title = "原卡信息";
TargetCard.Title = "目标卡信息";
ReplaceSectorContents(SourceSectorContents, targetSectors);
ReplaceSectorContents(TargetSectorContents, sourceSectors);
AppendLog("左右卡片信息已交换。");
}
[RelayCommand]
private void Clear()
{
DeviceStatus = "设备已连接";
ReaderStatus = "待机";
CurrentMode = "IC/ID 自动识别";
ActionHint = "点击“开始识别”读取原卡信息,或直接查看设备待机状态。";
IsCopyEnabled = false;
IsBusy = false;
SourceCard = CreateSourcePlaceholder();
TargetCard = CreateTargetPlaceholder();
ResetSectorContents();
ResetSectorBlockRows();
AppendLog("页面数据已清空,等待新的卡片操作。");
}
private void ResetSectorContents()
{
ReplaceSectorContents(SourceSectorContents, CreateSourceSectorPlaceholders());
ReplaceSectorContents(TargetSectorContents, CreateTargetSectorPlaceholders());
}
private void ResetSectorBlockRows()
{
SectorBlockRows.Clear();
foreach (var item in CreateSectorBlockRows())
{
SectorBlockRows.Add(item);
}
}
private void AppendLog(string message)
{
Logs.Insert(0, new OperationLogItem
{
Time = DateTime.Now.ToString("HH:mm:ss"),
Message = message
});
}
private static void ReplaceSectorContents(
ObservableCollection<SectorContentItem> target,
IEnumerable<SectorContentItem> items)
{
target.Clear();
foreach (var item in items)
{
target.Add(item);
}
}
private static List<SectorContentItem> CloneSectorContents(IEnumerable<SectorContentItem> items)
{
var result = new List<SectorContentItem>();
foreach (var item in items)
{
result.Add(item.Clone());
}
return result;
}
private static List<SectorContentItem> CreateSourceSectorPlaceholders()
{
return new List<SectorContentItem>
{
new SectorContentItem
{
SectorLabel = "--",
BlockLabel = "--",
DataPreview = "等待识别后显示原卡扇区内容。",
Status = "待识别"
}
};
}
private static List<SectorContentItem> CreateTargetSectorPlaceholders()
{
return new List<SectorContentItem>
{
new SectorContentItem
{
SectorLabel = "--",
BlockLabel = "--",
DataPreview = "等待拷贝后显示目标卡扇区内容。",
Status = "待写入"
}
};
}
private static List<SectorContentItem> CreateSourceSectorContents()
{
return new List<SectorContentItem>
{
new SectorContentItem
{
SectorLabel = "扇区 00",
BlockLabel = "块 00",
DataPreview = "04 A2 7F 19 88 04 00 00 12 34 56 78 9A BC DE F0",
Status = "已读取"
},
new SectorContentItem
{
SectorLabel = "扇区 01",
BlockLabel = "块 04",
DataPreview = "8F 23 91 C0 11 22 33 44 55 66 77 88 AA BB CC DD",
Status = "已读取"
},
new SectorContentItem
{
SectorLabel = "扇区 02",
BlockLabel = "块 08",
DataPreview = "13 56 4D 49 46 41 52 45 20 31 4B 00 00 00 00 00",
Status = "已读取"
},
new SectorContentItem
{
SectorLabel = "扇区 03",
BlockLabel = "块 0C",
DataPreview = "FF FF FF FF FF FF 07 80 69 C1 02 A4 B5 C6 D7 E8",
Status = "校验完成"
}
};
}
private static List<SectorContentItem> CreateTargetSectorContents()
{
return new List<SectorContentItem>
{
new SectorContentItem
{
SectorLabel = "扇区 00",
BlockLabel = "块 00",
DataPreview = "04 A2 7F 19 88 04 00 00 12 34 56 78 9A BC DE F0",
Status = "已写入"
},
new SectorContentItem
{
SectorLabel = "扇区 01",
BlockLabel = "块 04",
DataPreview = "8F 23 91 C0 11 22 33 44 55 66 77 88 AA BB CC DD",
Status = "已写入"
},
new SectorContentItem
{
SectorLabel = "扇区 02",
BlockLabel = "块 08",
DataPreview = "13 56 4D 49 46 41 52 45 20 31 4B 00 00 00 00 00",
Status = "已写入"
},
new SectorContentItem
{
SectorLabel = "扇区 03",
BlockLabel = "块 0C",
DataPreview = "FF FF FF FF FF FF 07 80 69 C1 02 A4 B5 C6 D7 E8",
Status = "已写入"
}
};
}
private static List<SectorBlockRowItem> CreateSectorBlockRows()
{
return new List<SectorBlockRowItem>
{
new SectorBlockRowItem
{
Sector = "扇区 00",
Block = "块 00",
Content = "11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF 00"
},
new SectorBlockRowItem
{
Sector = "扇区 01",
Block = "块 04",
Content = "A1 B2 C3 D4 E5 F6 00 11 22 33 44 55 66 77 88 99"
},
new SectorBlockRowItem
{
Sector = "扇区 02",
Block = "块 08",
Content = "01 03 05 07 09 0B 0D 0F 10 12 14 16 18 1A 1C 1E"
},
new SectorBlockRowItem
{
Sector = "扇区 03",
Block = "块 0C",
Content = "FE DC BA 98 76 54 32 10 89 67 45 23 01 EF CD AB"
}
};
}
private static CardInfoItem CreateSourcePlaceholder()
{
return new CardInfoItem
{
Title = "原卡信息",
CardType = "--",
CardNumber = "--",
Uid = "--",
Protocol = "--",
Frequency = "--",
SectorCount = "--",
WritableStatus = "--",
CurrentStatus = "待识别"
};
}
private static CardInfoItem CreateTargetPlaceholder()
{
return new CardInfoItem
{
Title = "目标卡信息",
CardType = "--",
CardNumber = "--",
Uid = "--",
Protocol = "--",
Frequency = "--",
SectorCount = "--",
WritableStatus = "--",
CurrentStatus = "待写入"
};
}
}