Merge pull request #295 from denglihong2007/feat/early-arrival-support-6482084022623165359

Add Support for Early Train Arrivals
This commit is contained in:
denglihong2007
2025-12-20 23:35:11 +08:00
committed by GitHub
7 changed files with 38 additions and 27 deletions

View File

@@ -16,10 +16,11 @@ namespace CRSim.ScreenSimulator.Converters
public string DisplayMode { get; set; } = "Normal";
public List<SolidColorBrush> WaitingColorList { get; set; } = new();
public List<SolidColorBrush> WaitingColorList { get; set; } = [];
public SolidColorBrush ArrivedText { get; set; } = new(Colors.LightGreen);
public SolidColorBrush ArrivingText { get; set; } = new(Colors.White);
public SolidColorBrush ArrivingLateText { get; set; } = new(Colors.Red);
public SolidColorBrush ArrivingEarlyText { get; set; } = new(Colors.LightGreen);
public SolidColorBrush WaitingColor { get; set; } = new(Colors.White);
public SolidColorBrush CheckInColor { get; set; } = new(Colors.LightGreen);
public SolidColorBrush StopCheckInColor { get; set; } = new(Colors.Red);
@@ -38,6 +39,7 @@ namespace CRSim.ScreenSimulator.Converters
if (values[0] is DateTime arriveTime){
if (values.Length > 1 && values[1] is TimeSpan state){
if (state.TotalMinutes > 0) return ArrivingLateText;
if (state.TotalMinutes < 0) return ArrivingEarlyText;
return now >= arriveTime ? ArrivedText : ArrivingText;
}
return now >= arriveTime? ArrivedText : ArrivingText;
@@ -83,23 +85,14 @@ namespace CRSim.ScreenSimulator.Converters
return WaitingColorList[rowNumber % WaitingColorList.Count];
return WaitingColor; // 正点
}
else
else if (status > TimeSpan.Zero)
{
return StopCheckInColor; // 晚点
}
}
public static string ToHourMinuteString(TimeSpan ts)
{
int totalHours = (int)ts.TotalHours; // 可以超过24
int minutes = ts.Minutes;
if (totalHours > 0 && minutes > 0)
return $"{totalHours}小时{minutes}分钟";
if (totalHours > 0)
return $"{totalHours}小时";
if (minutes > 0)
return $"{minutes}分钟";
return "0分钟"; // 特殊情况完全为0
else
{
return CheckInColor; // 早点
}
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) => null;
}

View File

@@ -15,6 +15,8 @@ namespace CRSim.ScreenSimulator.Converters
public string ArrivingText { get; set; } = "正点";
public string ArrivedLateText { get; set; } = "晚点{0}到达";
public string ArrivingLateText { get; set; } = "预计晚点{0}";
public string ArrivedEarlyText { get; set; } = "早点{0}到达";
public string ArrivingEarlyText { get; set; } = "预计早点{0}";
public string WaitingText { get; set; } = "候车";
public string CheckInText { get; set; } = "正在检票";
public string StopCheckInText { get; set; } = "停止检票";
@@ -42,12 +44,16 @@ namespace CRSim.ScreenSimulator.Converters
{
if (state.TotalMinutes > 0)
return string.Format(ArrivedLateText, ToHourMinuteString(state));
if (state.TotalMinutes < 0)
return string.Format(ArrivedEarlyText, ToHourMinuteString(state.Negate()));
return ArrivedText;
}
else
{
if (state.TotalMinutes > 0)
return string.Format(ArrivingLateText, ToHourMinuteString(state));
if (state.TotalMinutes < 0)
return string.Format(ArrivingEarlyText, ToHourMinuteString(state.Negate()));
return ArrivingText;
}
}
@@ -80,6 +86,8 @@ namespace CRSim.ScreenSimulator.Converters
{
if (state.TotalMinutes > 0)
return $"晚点约{ToHourMinuteString(state)}"; // 晚点
if (state.TotalMinutes < 0)
return $"早点约{ToHourMinuteString(state.Negate())}"; // 早点
return WaitingText; // 正点
}
}

View File

@@ -22,7 +22,7 @@
{
get
{
return State is null ? departureTime : departureTime + State;
return State is null || State < TimeSpan.Zero ? departureTime : departureTime + State;
}
set
{

View File

@@ -129,16 +129,16 @@ namespace CRSim.ScreenSimulator.ViewModels
continue;
}
DateTime? AdjustTime(TimeSpan? time) =>
time.HasValue ? (today.Add(time.Value).Add(trainNumber.Status.Value) > now ? today.Add(time.Value) : today.Add(time.Value).AddDays(1)) : null;
DateTime? AdjustTime(TimeSpan? time, TimeSpan? status) =>
time.HasValue ? (today.Add(time.Value).Add(status.Value) > now ? today.Add(time.Value) : today.Add(time.Value).AddDays(1)) : null;
TrainInfo.Add(new TrainInfo
{
TrainNumber = trainNumber.Number,
Terminal = trainNumber.Terminal,
Origin = trainNumber.Origin,
ArrivalTime = AdjustTime(trainNumber.ArrivalTime),
DepartureTime = AdjustTime(trainNumber.DepartureTime),
ArrivalTime = AdjustTime(trainNumber.ArrivalTime,trainNumber.Status),
DepartureTime = trainNumber.Status > TimeSpan.Zero ? AdjustTime(trainNumber.DepartureTime, trainNumber.Status) : AdjustTime(trainNumber.DepartureTime, TimeSpan.Zero),
TicketChecks = trainNumber.TicketCheckIds is null ? [] : [.. station.WaitingAreas
.SelectMany(w => w.TicketChecks)
.Where(tc => trainNumber.TicketCheckIds.Contains(tc.Id))

View File

@@ -12,19 +12,24 @@ namespace CRSim.Converters
public string ZeroString { get; set; } = string.Empty;
public object Convert(object value, Type targetType, object parameter, string language)
{
if (value is TimeSpan dateTime)
if (value is TimeSpan timeSpan)
{
if(dateTime == new TimeSpan())
if (timeSpan == TimeSpan.Zero)
{
return ZeroString;
}
var CultureInfo = new CultureInfo(Culture);
return (dateTime-dateTime.Days*TimeSpan.FromHours(24)).ToString(Format,CultureInfo);
string sign = timeSpan < TimeSpan.Zero ? "-" : string.Empty;
TimeSpan absoluteValue = timeSpan.Duration();
var cultureInfo = new CultureInfo(Culture);
var timeOnly = absoluteValue - TimeSpan.FromDays(absoluteValue.Days);
return sign + timeOnly.ToString(Format, cultureInfo);
}
if(value is null)
if (value is null)
{
return NullString;
}
return string.Empty;
}
public object ConvertBack(object value, Type targetType, object parameter, string language)

View File

@@ -597,7 +597,11 @@ public partial class StationManagementPageViewModel : ObservableObject
{
"停运" => null,
"正点" => TimeSpan.Zero,
var t => TimeSpan.TryParseExact(t, @"hh\:mm", null, out TimeSpan ts) ? ts : TimeSpan.Zero
var t when t.StartsWith("-") && TimeSpan.TryParseExact(t.Substring(1), @"hh\:mm", null, out var ts)
=> -ts,
var t when TimeSpan.TryParseExact(t, @"hh\:mm", null, out var ts)
=> ts,
_ => TimeSpan.Zero
}
});
}
@@ -641,6 +645,7 @@ public partial class StationManagementPageViewModel : ObservableObject
{
null => "停运",
var ts when ts == TimeSpan.Zero => "正点",
var ts when ts < TimeSpan.Zero => $"-{ts.Value.Duration():hh\\:mm}",
var ts => ts.Value.ToString(@"hh\:mm")
};
}

View File

@@ -104,7 +104,7 @@ public sealed partial class TrainStopDialog : Page
!string.IsNullOrWhiteSpace(DepartureTextBox.Text) &&
int.TryParse(LengthTextBox.Text, out int i) && i > 0 &&
PlatformComboBox.SelectedItem != null &&
int.TryParse(StatusTextBox.Text, out int m) && m >= 0;
int.TryParse(StatusTextBox.Text, out int m);
_onValidityChanged?.Invoke(isValid);
}