diff --git a/server/HoneyBox/src/HoneyBox.Admin.Business/Extensions/FlexibleDateTimeConverter.cs b/server/HoneyBox/src/HoneyBox.Admin.Business/Extensions/FlexibleDateTimeConverter.cs new file mode 100644 index 00000000..2a8ff9c7 --- /dev/null +++ b/server/HoneyBox/src/HoneyBox.Admin.Business/Extensions/FlexibleDateTimeConverter.cs @@ -0,0 +1,124 @@ +using System.Globalization; +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace HoneyBox.Admin.Business.Extensions; + +/// +/// 灵活的日期时间 JSON 转换器 +/// 支持多种日期格式:ISO 8601、"yyyy-MM-dd HH:mm:ss"、"yyyy-MM-dd HH:mm" 等 +/// +public class FlexibleDateTimeConverter : JsonConverter +{ + private static readonly string[] DateFormats = new[] + { + "yyyy-MM-dd HH:mm:ss", + "yyyy-MM-dd HH:mm", + "yyyy-MM-dd", + "yyyy/MM/dd HH:mm:ss", + "yyyy/MM/dd HH:mm", + "yyyy/MM/dd", + "MM/dd/yyyy HH:mm:ss", + "MM/dd/yyyy", + }; + + public override DateTime? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + if (reader.TokenType == JsonTokenType.Null) + { + return null; + } + + if (reader.TokenType == JsonTokenType.String) + { + var dateString = reader.GetString(); + + if (string.IsNullOrWhiteSpace(dateString)) + { + return null; + } + + // 尝试标准 ISO 8601 格式 + if (DateTime.TryParse(dateString, CultureInfo.InvariantCulture, DateTimeStyles.None, out var result)) + { + return result; + } + + // 尝试自定义格式 + foreach (var format in DateFormats) + { + if (DateTime.TryParseExact(dateString, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out result)) + { + return result; + } + } + + throw new JsonException($"无法解析日期时间: {dateString}"); + } + + throw new JsonException($"意外的 JSON 令牌类型: {reader.TokenType}"); + } + + public override void Write(Utf8JsonWriter writer, DateTime? value, JsonSerializerOptions options) + { + if (value.HasValue) + { + writer.WriteStringValue(value.Value.ToString("yyyy-MM-dd HH:mm:ss")); + } + else + { + writer.WriteNullValue(); + } + } +} + +/// +/// 非空日期时间转换器 +/// +public class FlexibleDateTimeNonNullableConverter : JsonConverter +{ + private static readonly string[] DateFormats = new[] + { + "yyyy-MM-dd HH:mm:ss", + "yyyy-MM-dd HH:mm", + "yyyy-MM-dd", + "yyyy/MM/dd HH:mm:ss", + "yyyy/MM/dd HH:mm", + "yyyy/MM/dd", + }; + + public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + if (reader.TokenType == JsonTokenType.String) + { + var dateString = reader.GetString(); + + if (string.IsNullOrWhiteSpace(dateString)) + { + return default; + } + + if (DateTime.TryParse(dateString, CultureInfo.InvariantCulture, DateTimeStyles.None, out var result)) + { + return result; + } + + foreach (var format in DateFormats) + { + if (DateTime.TryParseExact(dateString, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out result)) + { + return result; + } + } + + throw new JsonException($"无法解析日期时间: {dateString}"); + } + + throw new JsonException($"意外的 JSON 令牌类型: {reader.TokenType}"); + } + + public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options) + { + writer.WriteStringValue(value.ToString("yyyy-MM-dd HH:mm:ss")); + } +} diff --git a/server/HoneyBox/src/HoneyBox.Admin.Business/Models/Goods/GoodsModels.cs b/server/HoneyBox/src/HoneyBox.Admin.Business/Models/Goods/GoodsModels.cs index 02e20e94..4f59aeb3 100644 --- a/server/HoneyBox/src/HoneyBox.Admin.Business/Models/Goods/GoodsModels.cs +++ b/server/HoneyBox/src/HoneyBox.Admin.Business/Models/Goods/GoodsModels.cs @@ -1,4 +1,6 @@ using HoneyBox.Admin.Business.Models; +using HoneyBox.Admin.Business.Extensions; +using System.Text.Json.Serialization; namespace HoneyBox.Admin.Business.Models.Goods; @@ -103,16 +105,19 @@ public class GoodsCreateRequest /// /// 福利屋开始时间 /// + [JsonConverter(typeof(FlexibleDateTimeConverter))] public DateTime? FlwStartTime { get; set; } /// /// 福利屋结束时间 /// + [JsonConverter(typeof(FlexibleDateTimeConverter))] public DateTime? FlwEndTime { get; set; } /// /// 开放时间 /// + [JsonConverter(typeof(FlexibleDateTimeConverter))] public DateTime? OpenTime { get; set; } /// diff --git a/server/HoneyBox/src/HoneyBox.Core/Services/WelfareService.cs b/server/HoneyBox/src/HoneyBox.Core/Services/WelfareService.cs index 32dbbdcb..6a207742 100644 --- a/server/HoneyBox/src/HoneyBox.Core/Services/WelfareService.cs +++ b/server/HoneyBox/src/HoneyBox.Core/Services/WelfareService.cs @@ -597,6 +597,9 @@ public class WelfareService : IWelfareService var now = DateTime.Now; IQueryable query; + _logger.LogInformation("GetFuliwuListAsync: userId={UserId}, type={Type}, page={Page}, userTotalConsumption={Consumption}, now={Now}", + userId, type, page, userTotalConsumption, now); + if (type == 1) { // type=1 进行中:Status=1, IsOpen=0, 且开奖时间未到 @@ -623,6 +626,8 @@ public class WelfareService : IWelfareService var total = await query.CountAsync(); var lastPage = (int)Math.Ceiling((double)total / paginate); + _logger.LogInformation("GetFuliwuListAsync: total={Total}, lastPage={LastPage}", total, lastPage); + // 分页查询 var goods = await query .Skip((page - 1) * paginate)