using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using System.IO;
using System.Linq;
using System.Text;
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.Navigation;
using System.Windows.Shapes;
using System.Runtime.InteropServices;
using System.Globalization;
using Path = System.IO.Path; // 明確指定使用 System.IO.Path
namespace KTVApp
{
public class StringNullOrEmptyConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return !string.IsNullOrEmpty(value as string);
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
///
/// MainWindow.xaml 的互動邏輯
///
public partial class MainWindow : Window, INotifyPropertyChanged
{
private ObservableCollection _rooms;
private TcpServer _tcpServer;
[DllImport("kernel32.dll")]
static extern bool AllocConsole();
public MainWindow()
{
AllocConsole(); // 分配一个控制台窗口
Rooms = new ObservableCollection();
LoadRoomsFromFile("room.txt");
LoadRoomStatesFromFile("roomstates.txt"); // 加载房间的状态
DataContext = this;
// 启动 TCP 服务器
_tcpServer = new TcpServer(1000);
_tcpServer.MessageReceived += OnMessageReceived; // 订阅事件
_tcpServer.Start();
}
public ObservableCollection Rooms
{
get => _rooms;
set
{
_rooms = value;
OnPropertyChanged();
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged([CallerMemberName] string name = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
}
private void Rectangle_MouseDown(object sender, MouseButtonEventArgs e)
{
var rect = sender as Rectangle;
var room = rect.DataContext as Room;
// Open a new window and pass the room information
var roomDetailsWindow = new RoomDetailsWindow(room, _tcpServer);
roomDetailsWindow.Show();
}
private void LoadRoomsFromFile(string filePath)
{
if (!File.Exists(filePath))
{
MessageBox.Show($"File not found: {filePath}");
return;
}
try
{
var lines = File.ReadAllLines(filePath);
foreach (var line in lines)
{
var parts = line.Split(';');
if (parts.Length == 2)
{
var floor = parts[0];
var roomNumbers = parts[1].Split(',');
foreach (var roomNumber in roomNumbers)
{
// 获取roomNumber的末三码
var lastThreeDigits = roomNumber.Length > 3 ? roomNumber.Substring(roomNumber.Length - 3) : roomNumber;
var newRoomNumber = "0" + lastThreeDigits;
Rooms.Add(new Room
{
RoomNumber = newRoomNumber,
RoomPC = roomNumber,
Status = "可用", // 默认状态,可以根据需要修改
TimeRange = "Not Set", // 默认时间范围,可以根据需要修改
ServiceStatus = "NonService" // 默认服务状态
});
}
}
}
}
catch (Exception ex)
{
MessageBox.Show($"Error reading file: {ex.Message}");
}
}
private void LoadRoomStatesFromFile(string filePath)
{
if (!File.Exists(filePath))
{
MessageBox.Show($"File not found: {filePath}");
return;
}
try
{
var lines = File.ReadAllLines(filePath);
foreach (var line in lines)
{
var parts = line.Split(';');
if (parts.Length == 5)
{
var roomPC = parts[0];
var roomNumber = parts[1];
var status = parts[2];
var timeRange = parts[3];
var serviceStatus = parts[4];
var room = Rooms.FirstOrDefault(r => r.RoomPC == roomPC);
if (room != null)
{
room.RoomNumber = roomNumber;
room.Status = status;
room.TimeRange = timeRange;
room.ServiceStatus = serviceStatus;
}
else
{
// Room does not exist, so add a new one
Rooms.Add(new Room
{
RoomPC = roomPC,
RoomNumber = roomNumber,
Status = status,
TimeRange = timeRange,
ServiceStatus = serviceStatus
});
}
}
}
}
catch (Exception ex)
{
MessageBox.Show($"Error reading file: {ex.Message}");
}
}
private void OnMessageReceived(string message)
{
Console.WriteLine($"收到消息: {message}");
var parts = message.Split(',');
if (parts.Length >= 2)
{
var roomNumber = parts[0].PadLeft(4, '0');
var command = parts[1];
Application.Current.Dispatcher.Invoke(() =>
{
try
{
var room = Rooms.FirstOrDefault(r => r.RoomNumber == roomNumber);
if (room != null)
{
if (command == "O" && parts.Length >= 4)
{
room.Status = "已占用";
room.TimeRange = parts[3];
Console.WriteLine($"房間 {roomNumber} 開機,時間: {parts[3]}");
SaveRoomsToFile("roomstates.txt");
var roomDetailsWindow = new RoomDetailsWindow(room, _tcpServer);
roomDetailsWindow.Start_Click(null, null);
}
else if (command == "O")
{
room.Status = "已占用";
room.TimeRange = "Not Set";
Console.WriteLine($"房間 {roomNumber} 開機");
SaveRoomsToFile("roomstates.txt");
var roomDetailsWindow = new RoomDetailsWindow(room, _tcpServer);
roomDetailsWindow.Start_Click(null, null);
}
else if (command == "P")
{
room.Status = "可用";
room.TimeRange = "Not Set";
Console.WriteLine($"房間 {roomNumber} 關機");
SaveRoomsToFile("roomstates.txt");
var roomDetailsWindow = new RoomDetailsWindow(room, _tcpServer);
roomDetailsWindow.Shutdown_Click(null, null);
}
}
else
{
Console.WriteLine($"找不到房間: {roomNumber}");
}
}
catch (Exception ex)
{
Console.WriteLine($"錯誤: {ex.Message}");
}
});
}
}
public void SaveRoomsToFile(string filePath)
{
try
{
string fullPath = Path.GetFullPath(filePath);
var lines = Rooms.Select(r => $"{r.RoomPC};{r.RoomNumber};{r.Status};{r.TimeRange};{r.ServiceStatus}").ToList();
File.WriteAllLines(fullPath, lines);
Console.WriteLine("已保存房間狀態");
}
catch (Exception ex)
{
Console.WriteLine($"保存失敗: {ex.Message}");
MessageBox.Show($"Error saving file: {ex.Message}");
}
}
protected override void OnClosing(CancelEventArgs e)
{
base.OnClosing(e);
SaveRoomsToFile("roomstates.txt"); // 使用新的文件名
}
}
public class Room : INotifyPropertyChanged
{
private string _status;
private string _serviceStatus;
private string _timeRange;
private string _roomNumber;
public string RoomPC { get; set; }
public string RoomNumber
{
get => _roomNumber;
set
{
if (_roomNumber != value)
{
_roomNumber = value;
OnPropertyChanged();
}
}
}
public string Status
{
get => _status;
set
{
if (_status != value)
{
_status = value;
OnPropertyChanged();
}
}
}
public string TimeRange
{
get => _timeRange;
set
{
if (_timeRange != value)
{
_timeRange = value;
OnPropertyChanged();
}
}
}
public string ServiceStatus
{
get => _serviceStatus;
set
{
if (_serviceStatus != value)
{
_serviceStatus = value;
OnPropertyChanged();
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged([CallerMemberName] string name = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
}
}
}