348 lines
12 KiB
C#
348 lines
12 KiB
C#
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();
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// MainWindow.xaml 的互動邏輯
|
|
/// </summary>
|
|
public partial class MainWindow : Window, INotifyPropertyChanged
|
|
{
|
|
private ObservableCollection<Room> _rooms;
|
|
private TcpServer _tcpServer;
|
|
|
|
[DllImport("kernel32.dll")]
|
|
static extern bool AllocConsole();
|
|
|
|
public MainWindow()
|
|
{
|
|
AllocConsole(); // 分配一个控制台窗口
|
|
Rooms = new ObservableCollection<Room>();
|
|
LoadRoomsFromFile("room.txt");
|
|
LoadRoomStatesFromFile("roomstates.txt"); // 加载房间的状态
|
|
DataContext = this;
|
|
|
|
// 启动 TCP 服务器
|
|
_tcpServer = new TcpServer(1000);
|
|
_tcpServer.MessageReceived += OnMessageReceived; // 订阅事件
|
|
_tcpServer.Start();
|
|
}
|
|
|
|
public ObservableCollection<Room> Rooms
|
|
{
|
|
get => _rooms;
|
|
set
|
|
{
|
|
_rooms = value;
|
|
OnPropertyChanged();
|
|
}
|
|
}
|
|
|
|
public event PropertyChangedEventHandler PropertyChanged;
|
|
|
|
protected void OnPropertyChanged([CallerMemberName] string name = null)
|
|
{
|
|
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
|
|
}
|
|
/// <summary>
|
|
/// 當使用者點擊 Rectangle 物件時會觸發此事件
|
|
/// </summary>
|
|
/// <param name="sender"></param>
|
|
/// <param name="e"></param>
|
|
private void Rectangle_MouseDown(object sender, MouseButtonEventArgs e)
|
|
{
|
|
// 將 sender 轉換為 Rectangle 類型
|
|
var rect = sender as Rectangle;
|
|
|
|
// 透過 DataContext 獲取關聯的 Room 物件
|
|
var room = rect.DataContext as Room;
|
|
|
|
// 根據傳入的房間資料創建新的 RoomDetailsWindow 實例
|
|
// 並且傳遞房間資訊 (room) 以及 TCP 服務器 (_tcpServer) 給該視窗
|
|
var roomDetailsWindow = new RoomDetailsWindow(room, _tcpServer);
|
|
|
|
// 顯示新創建的 RoomDetailsWindow
|
|
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));
|
|
}
|
|
}
|
|
}
|