mirror of
https://github.com/denglihong2007/CRSim
synced 2026-05-14 23:55:36 +08:00
Merge pull request #295 from denglihong2007/feat/early-arrival-support-6482084022623165359
Add Support for Early Train Arrivals
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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; // 正点
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
{
|
||||
get
|
||||
{
|
||||
return State is null ? departureTime : departureTime + State;
|
||||
return State is null || State < TimeSpan.Zero ? departureTime : departureTime + State;
|
||||
}
|
||||
set
|
||||
{
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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")
|
||||
};
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user