using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using SmartScanner.OperateLog;
using Newtonsoft.Json;
using static SmartScanner.IDViewerDefines;
using static SmartScanner.IDViewerSDK;
namespace SmartScanner
{
///
/// ProductManager.xaml 的交互逻辑
///
public partial class ProductManager : Window
{
private readonly ObservableCollection> _ipMapping = new ObservableCollection>();
private ObservableCollection _availableIPs = new ObservableCollection();
private const string ConfigFile = "connection_order.json";
IDDeviceInfo[] deviceInfo = new IDDeviceInfo[100];
public ProductManager()
{
InitializeComponent();
long result = IDVIEWER_Init_();
dgMapping.ItemsSource = _ipMapping;
cmbIP.ItemsSource = _availableIPs;
RefreshDeviceList();
}
public void SetControlsEnabled(bool isEnabled)
{
// 禁用或启用所有可编辑的控件
//LoadConfig_RJ.IsEnabled = isEnabled;
cmbOrder.IsEnabled = isEnabled;
cmbIP.IsEnabled = isEnabled;
DeviceRefresh_PM.IsEnabled = isEnabled;
AddMapping_PM.IsEnabled = isEnabled;
SaveConfig_PM.IsEnabled = isEnabled;
//LoadConfig_PM.IsEnabled = isEnabled;
// ... 其他需要控制的控件
}
private void RefreshDeviceList()
{
try
{
//获取设备列表句柄
IntPtr devicesListHandle = IDVIEWER_DiscoveryDevices_(500);
// 获取设备总数
int deviceCount = (int)IDVIEWER_GetDevicesLength_(devicesListHandle);
// 生成顺序号选项(1~N)
cmbOrder.ItemsSource = Enumerable.Range(1, deviceCount).ToList();
cmbOrder.SelectedIndex = 0;
List ips = new List();
for (int i = 0; i < deviceCount; i++)
{
//获取相机IP
IDViewerSDK.IDVIEWER_SelectIDDeviceInfo_(devicesListHandle, ref deviceInfo[i], (uint)i);
string deviceIP = deviceInfo[i].cameraIP.Trim();
ips.Add(deviceIP);
}
// 获取可用IP列表
ips.Where(IsValidIP).ToList();
_availableIPs.Clear();
foreach (var ip in ips)
{
_availableIPs.Add(ip);
}
tbStatus.Text = $"检测到 {deviceCount} 台设备 | 可用IP:{ips.Count} 个";
}
catch (Exception ex)
{
MessageBox.Show($"设备检测失败:{ex.Message}");
}
}
private void BtnAddMapping_Click(object sender, RoutedEventArgs e)
{
if (cmbOrder.SelectedItem == null || cmbIP.SelectedItem == null)
{
MessageBox.Show("请选择顺序和IP地址");
return;
}
int selectedOrder = (int)cmbOrder.SelectedItem;
string selectedIP = cmbIP.SelectedItem.ToString();
// 检查顺序冲突
if (_ipMapping.Any(x => x.Key == selectedOrder))
{
MessageBox.Show("该顺序已分配,请先移除原有分配");
return;
}
// 检查IP重复
if (_ipMapping.Any(x => x.Value == selectedIP))
{
MessageBox.Show("该IP已分配顺序");
return;
}
_ipMapping.Add(new KeyValuePair(selectedOrder, selectedIP));
SortMapping();
}
private void DeleteMapping_Click(object sender, RoutedEventArgs e)
{
if (dgMapping.SelectedItem is KeyValuePair item)
{
_ipMapping.Remove(item);
SortMapping();
}
}
private void SortMapping()
{
var sorted = _ipMapping
.OrderBy(x => x.Key)
.ToList();
_ipMapping.Clear();
foreach (var item in sorted)
{
_ipMapping.Add(item);
}
}
private void BtnRefreshDevices_Click(object sender, RoutedEventArgs e) => RefreshDeviceList();
// 保存/加载方法
private void BtnSave_Click(object sender, RoutedEventArgs e)
{
try
{
var config = new
{
LastModified = DateTime.Now,
Mapping = _ipMapping.ToList()
};
File.WriteAllText(ConfigFile, JsonConvert.SerializeObject(config, Formatting.Indented));
MessageBox.Show("配置保存成功");
// 记录日志
OperateLogService.LogOperation(
"映射表修改",
$"映射表修改为: {ConfigFile}",
null);
}
catch (Exception ex)
{
MessageBox.Show($"保存失败:{ex.Message}");
}
}
private void BtnLoad_Click(object sender, RoutedEventArgs e)
{
var loadedMapping = LoadConfig();
if (loadedMapping.Count > 0)
{
_ipMapping.Clear(); // 清空当前映射
foreach (var item in loadedMapping)
{
_ipMapping.Add(item); // 添加加载的配置
}
SortMapping(); // 重新排序
RefreshMappingDisplay(); // 刷新界面显示
MessageBox.Show("配置加载成功");
}
}
private void RefreshMappingDisplay()
{
// 绑定数据到 DataGrid
dgMapping.ItemsSource = null; // 先清空绑定
dgMapping.ItemsSource = _ipMapping.ToList(); // 重新绑定
}
public List> LoadConfig()
{
try
{
if (File.Exists(ConfigFile))
{
var json = File.ReadAllText(ConfigFile);
var config = JsonConvert.DeserializeObject(json);
var mapping = new List>();
foreach (var item in config.Mapping)
{
mapping.Add(new KeyValuePair(
(int)item.Key,
(string)item.Value));
}
return mapping;
}
}
catch (Exception ex)
{
MessageBox.Show($"加载映射表失败:{ex.Message}", "错误", MessageBoxButton.OK, MessageBoxImage.Error);
}
return new List>();
}
private static bool IsValidIP(string ip) => Regex.IsMatch(ip,
@"^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$");
}
}