This commit is contained in:
zpc 2026-02-04 00:53:45 +08:00
parent 69b3c02b60
commit 18e6f339d6
3 changed files with 134 additions and 0 deletions

View File

@ -0,0 +1,124 @@
using System.Globalization;
using System.Text.Json;
using System.Text.Json.Serialization;
namespace HoneyBox.Admin.Business.Extensions;
/// <summary>
/// 灵活的日期时间 JSON 转换器
/// 支持多种日期格式ISO 8601、"yyyy-MM-dd HH:mm:ss"、"yyyy-MM-dd HH:mm" 等
/// </summary>
public class FlexibleDateTimeConverter : JsonConverter<DateTime?>
{
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();
}
}
}
/// <summary>
/// 非空日期时间转换器
/// </summary>
public class FlexibleDateTimeNonNullableConverter : JsonConverter<DateTime>
{
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"));
}
}

View File

@ -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
/// <summary>
/// 福利屋开始时间
/// </summary>
[JsonConverter(typeof(FlexibleDateTimeConverter))]
public DateTime? FlwStartTime { get; set; }
/// <summary>
/// 福利屋结束时间
/// </summary>
[JsonConverter(typeof(FlexibleDateTimeConverter))]
public DateTime? FlwEndTime { get; set; }
/// <summary>
/// 开放时间
/// </summary>
[JsonConverter(typeof(FlexibleDateTimeConverter))]
public DateTime? OpenTime { get; set; }
/// <summary>

View File

@ -597,6 +597,9 @@ public class WelfareService : IWelfareService
var now = DateTime.Now;
IQueryable<Good> 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)