using System.Security.Claims; using HoneyBox.Core.Interfaces; using HoneyBox.Model.Base; using HoneyBox.Model.Models; using HoneyBox.Model.Models.Lottery; using HoneyBox.Model.Models.Order; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using OrderPrizeOrderLogRequest = HoneyBox.Model.Models.Order.PrizeOrderLogRequest; namespace HoneyBox.Api.Controllers; /// /// 订单控制器 - 处理订单创建、查询和抽奖结果 /// /// /// 提供一番赏、无限赏、商城等订单的创建、金额计算、查询和抽奖结果查询功能 /// [ApiController] [Route("api")] public class OrderController : ControllerBase { private readonly IOrderService _orderService; private readonly ILotteryService _lotteryService; private readonly ILogger _logger; public OrderController( IOrderService orderService, ILotteryService lotteryService, ILogger logger) { _orderService = orderService; _lotteryService = lotteryService; _logger = logger; } #region 一番赏订单 /// /// 一番赏订单金额计算 /// /// /// POST /api/ordermoney /// /// 计算一番赏订单金额,包含优惠券抵扣、余额抵扣等 /// Requirements: 1.1-1.6 /// /// 订单金额计算请求参数 /// 订单金额计算结果 [HttpPost("ordermoney")] [Authorize] [ProducesResponseType(typeof(ApiResponse), StatusCodes.Status200OK)] [ProducesResponseType(typeof(ApiResponse), StatusCodes.Status401Unauthorized)] public async Task> CalculateOrderMoney([FromBody] OrderMoneyRequest? request) { var userId = GetCurrentUserId(); if (userId == null) { return ApiResponse.Unauthorized(); } try { if (request == null) { return ApiResponse.Fail("请求参数不能为空"); } if (request.GoodsId <= 0) { return ApiResponse.Fail("商品ID不能为空"); } if (request.PrizeNum <= 0) { return ApiResponse.Fail("抽奖次数不能为空"); } var result = await _orderService.CalculateOrderMoneyAsync(userId.Value, request); return ApiResponse.Success(result); } catch (InvalidOperationException ex) { _logger.LogWarning("Calculate order money failed: UserId={UserId}, GoodsId={GoodsId}, Error={Error}", userId, request?.GoodsId, ex.Message); return ApiResponse.Fail(ex.Message); } catch (Exception ex) { _logger.LogError(ex, "Failed to calculate order money: UserId={UserId}, GoodsId={GoodsId}", userId, request?.GoodsId); return ApiResponse.Fail("计算订单金额失败"); } } /// /// 一番赏订单创建 /// /// /// POST /api/orderbuy /// /// 创建一番赏订单并执行抽奖,返回订单信息和抽奖结果 /// Requirements: 2.1-2.6 /// /// 订单创建请求参数 /// 订单创建结果,包含订单号和支付信息 [HttpPost("orderbuy")] [Authorize] [ProducesResponseType(typeof(ApiResponse), StatusCodes.Status200OK)] [ProducesResponseType(typeof(ApiResponse), StatusCodes.Status401Unauthorized)] public async Task> CreateOrder([FromBody] OrderBuyRequest? request) { var userId = GetCurrentUserId(); if (userId == null) { return ApiResponse.Unauthorized(); } try { if (request == null) { return ApiResponse.Fail("请求参数不能为空"); } if (request.GoodsId <= 0) { return ApiResponse.Fail("商品ID不能为空"); } if (request.PrizeNum <= 0) { return ApiResponse.Fail("抽奖次数不能为空"); } var result = await _orderService.CreateOrderAsync(userId.Value, request); return ApiResponse.Success(result); } catch (InvalidOperationException ex) { _logger.LogWarning("Create order failed: UserId={UserId}, GoodsId={GoodsId}, Error={Error}", userId, request?.GoodsId, ex.Message); // 未绑定手机号返回特殊状态码 -9,前端根据此状态码跳转绑定页面 if (ex.Message.Contains("绑定手机号")) { return ApiResponse.Fail(ex.Message, -9); } return ApiResponse.Fail(ex.Message); } catch (Exception ex) { _logger.LogError(ex, "Failed to create order: UserId={UserId}, GoodsId={GoodsId}, Message={Message}, StackTrace={StackTrace}", userId, request?.GoodsId, ex.Message, ex.StackTrace); return ApiResponse.Fail($"创建订单失败: {ex.Message}"); } } #endregion #region 无限赏订单 /// /// 无限赏订单金额计算 /// POST /api/infinite_ordermoney /// Requirements: 3.1-3.3 /// [HttpPost("infinite_ordermoney")] [Authorize] public async Task> CalculateInfiniteOrderMoney([FromBody] InfiniteOrderMoneyRequest? request) { var userId = GetCurrentUserId(); if (userId == null) { return ApiResponse.Unauthorized(); } try { if (request == null) { return ApiResponse.Fail("请求参数不能为空"); } if (request.GoodsId <= 0) { return ApiResponse.Fail("商品ID不能为空"); } if (request.PrizeNum <= 0) { return ApiResponse.Fail("抽奖次数不能为空"); } var result = await _orderService.CalculateInfiniteOrderMoneyAsync(userId.Value, request); return ApiResponse.Success(result); } catch (InvalidOperationException ex) { _logger.LogWarning("Calculate infinite order money failed: UserId={UserId}, GoodsId={GoodsId}, Error={Error}", userId, request?.GoodsId, ex.Message); return ApiResponse.Fail(ex.Message); } catch (Exception ex) { _logger.LogError(ex, "Failed to calculate infinite order money: UserId={UserId}, GoodsId={GoodsId}", userId, request?.GoodsId); return ApiResponse.Fail("计算订单金额失败"); } } /// /// 无限赏订单创建 /// POST /api/infinite_orderbuy /// Requirements: 4.1-4.3 /// [HttpPost("infinite_orderbuy")] [Authorize] public async Task> CreateInfiniteOrder([FromBody] InfiniteOrderBuyRequest? request) { var userId = GetCurrentUserId(); if (userId == null) { return ApiResponse.Unauthorized(); } try { if (request == null) { return ApiResponse.Fail("请求参数不能为空"); } if (request.GoodsId <= 0) { return ApiResponse.Fail("商品ID不能为空"); } if (request.PrizeNum <= 0) { return ApiResponse.Fail("抽奖次数不能为空"); } var result = await _orderService.CreateInfiniteOrderAsync(userId.Value, request); return ApiResponse.Success(result); } catch (InvalidOperationException ex) { _logger.LogWarning("Create infinite order failed: UserId={UserId}, GoodsId={GoodsId}, Error={Error}", userId, request?.GoodsId, ex.Message); // 未绑定手机号返回特殊状态码 -9,前端根据此状态码跳转绑定页面 if (ex.Message.Contains("绑定手机号")) { return ApiResponse.Fail(ex.Message, -9); } return ApiResponse.Fail(ex.Message); } catch (Exception ex) { _logger.LogError(ex, "Failed to create infinite order: UserId={UserId}, GoodsId={GoodsId}", userId, request?.GoodsId); return ApiResponse.Fail("创建订单失败"); } } #endregion #region 商城订单 /// /// 商城订单金额计算 /// POST /api/mall_ordermoney /// Requirements: 5.1-5.3 /// [HttpPost("mall_ordermoney")] [Authorize] public async Task> CalculateMallOrderMoney([FromBody] MallOrderMoneyRequest? request) { var userId = GetCurrentUserId(); if (userId == null) { return ApiResponse.Unauthorized(); } try { if (request == null) { return ApiResponse.Fail("请求参数不能为空"); } if (request.GoodsId <= 0) { return ApiResponse.Fail("商品ID不能为空"); } var result = await _orderService.CalculateMallOrderMoneyAsync(userId.Value, request); return ApiResponse.Success(result); } catch (InvalidOperationException ex) { _logger.LogWarning("Calculate mall order money failed: UserId={UserId}, GoodsId={GoodsId}, Error={Error}", userId, request?.GoodsId, ex.Message); return ApiResponse.Fail(ex.Message); } catch (Exception ex) { _logger.LogError(ex, "Failed to calculate mall order money: UserId={UserId}, GoodsId={GoodsId}", userId, request?.GoodsId); return ApiResponse.Fail("计算订单金额失败"); } } #endregion #region 订单查询 /// /// 订单列表查询 /// /// /// POST /api/order_list /// /// 获取当前用户的订单列表,支持按状态筛选和分页 /// Requirements: 6.1-6.4 /// /// 订单列表请求参数 /// 订单列表分页数据 [HttpPost("order_list")] [Authorize] [ProducesResponseType(typeof(ApiResponse>), StatusCodes.Status200OK)] [ProducesResponseType(typeof(ApiResponse>), StatusCodes.Status401Unauthorized)] public async Task>> GetOrderList([FromBody] OrderListRequest? request) { var userId = GetCurrentUserId(); if (userId == null) { return ApiResponse>.Unauthorized(); } try { request ??= new OrderListRequest(); if (request.Page < 1) request.Page = 1; if (request.PageSize < 1) request.PageSize = 10; var result = await _orderService.GetOrderListAsync(userId.Value, request); return ApiResponse>.Success(result); } catch (Exception ex) { _logger.LogError(ex, "Failed to get order list: UserId={UserId}", userId); return ApiResponse>.Fail("获取订单列表失败"); } } /// /// 订单详情查询 /// POST /api/order_detail /// Requirements: 7.1-7.3 /// [HttpPost("order_detail")] [Authorize] public async Task> GetOrderDetail([FromBody] OrderDetailRequest? request) { var userId = GetCurrentUserId(); if (userId == null) { return ApiResponse.Unauthorized(); } try { if (request == null || string.IsNullOrWhiteSpace(request.OrderNum)) { return ApiResponse.Fail("订单号不能为空"); } var result = await _orderService.GetOrderDetailAsync(userId.Value, request.OrderNum); return ApiResponse.Success(result); } catch (InvalidOperationException ex) { _logger.LogWarning("Get order detail failed: UserId={UserId}, OrderNum={OrderNum}, Error={Error}", userId, request?.OrderNum, ex.Message); return ApiResponse.Fail(ex.Message); } catch (Exception ex) { _logger.LogError(ex, "Failed to get order detail: UserId={UserId}, OrderNum={OrderNum}", userId, request?.OrderNum); return ApiResponse.Fail("获取订单详情失败"); } } #endregion #region 抽奖结果查询 /// /// 一番赏抽奖结果查询 /// POST /api/prizeorderlog /// Requirements: 8.1-8.3 /// [HttpPost("prizeorderlog")] [Authorize] public async Task> GetPrizeOrderLog([FromBody] OrderPrizeOrderLogRequest? request) { var userId = GetCurrentUserId(); if (userId == null) { return ApiResponse.Unauthorized(); } try { if (request == null || string.IsNullOrWhiteSpace(request.OrderNum)) { return ApiResponse.Fail("订单号不能为空"); } var result = await _orderService.GetPrizeOrderLogAsync(userId.Value, request.OrderNum); return ApiResponse.Success(result); } catch (InvalidOperationException ex) { _logger.LogWarning("Get prize order log failed: UserId={UserId}, OrderNum={OrderNum}, Error={Error}", userId, request?.OrderNum, ex.Message); return ApiResponse.Fail(ex.Message); } catch (Exception ex) { _logger.LogError(ex, "Failed to get prize order log: UserId={UserId}, OrderNum={OrderNum}", userId, request?.OrderNum); return ApiResponse.Fail("获取抽奖结果失败"); } } /// /// 无限赏抽奖结果查询 /// POST /api/infinite_prizeorderlog /// Requirements: 9.1-9.2 /// [HttpPost("infinite_prizeorderlog")] [Authorize] public async Task> GetInfinitePrizeOrderLog([FromBody] OrderPrizeOrderLogRequest? request) { var userId = GetCurrentUserId(); if (userId == null) { return ApiResponse.Unauthorized(); } try { if (request == null || string.IsNullOrWhiteSpace(request.OrderNum)) { return ApiResponse.Fail("订单号不能为空"); } var result = await _orderService.GetInfinitePrizeOrderLogAsync(userId.Value, request.OrderNum); return ApiResponse.Success(result); } catch (InvalidOperationException ex) { _logger.LogWarning("Get infinite prize order log failed: UserId={UserId}, OrderNum={OrderNum}, Error={Error}", userId, request?.OrderNum, ex.Message); return ApiResponse.Fail(ex.Message); } catch (Exception ex) { _logger.LogError(ex, "Failed to get infinite prize order log: UserId={UserId}, OrderNum={OrderNum}", userId, request?.OrderNum); return ApiResponse.Fail("获取抽奖结果失败"); } } /// /// 无限赏中奖记录查询 /// GET /api/infinite_shang_log /// Requirements: 4.1-4.3 /// [HttpGet("infinite_shang_log")] public async Task> GetInfiniteShangLog([FromQuery] InfiniteShangLogRequest? request) { try { if (request == null || request.GoodsId <= 0) { return ApiResponse.Fail("商品ID不能为空"); } // 设置默认分页参数 var page = request.Page > 0 ? request.Page : 1; var pageSize = request.PageSize > 0 ? request.PageSize : 100; var result = await _lotteryService.GetInfiniteShangLogAsync( request.GoodsId, request.ShangId ?? 0, request.IsMibao ?? 0, page, pageSize); return ApiResponse.Success(result); } catch (InvalidOperationException ex) { _logger.LogWarning("Get infinite shang log failed: GoodsId={GoodsId}, Error={Error}", request?.GoodsId, ex.Message); return ApiResponse.Fail(ex.Message); } catch (Exception ex) { _logger.LogError(ex, "Failed to get infinite shang log: GoodsId={GoodsId}", request?.GoodsId); return ApiResponse.Fail("获取中奖记录失败"); } } /// /// 无限赏用户抽奖记录查询(盒子抽奖记录) /// POST /api/infinite_prizerecords /// Requirements: 5.1-5.3 /// [HttpPost("infinite_prizerecords")] [Authorize] public async Task> GetInfinitePrizeRecords([FromBody] InfinitePrizeRecordsRequest? request) { var userId = GetCurrentUserId(); if (userId == null) { return ApiResponse.Unauthorized(); } try { if (request == null || request.GoodsId <= 0) { return ApiResponse.Fail("商品ID不能为空"); } // 设置默认分页参数 var page = request.Page > 0 ? request.Page : 1; var pageSize = request.PageSize > 0 ? request.PageSize : 100; var result = await _lotteryService.GetInfinitePrizeRecordsAsync( userId.Value, request.GoodsId, page, pageSize); return ApiResponse.Success(result); } catch (InvalidOperationException ex) { _logger.LogWarning("Get infinite prize records failed: UserId={UserId}, GoodsId={GoodsId}, Error={Error}", userId, request?.GoodsId, ex.Message); return ApiResponse.Fail(ex.Message); } catch (Exception ex) { _logger.LogError(ex, "Failed to get infinite prize records: UserId={UserId}, GoodsId={GoodsId}", userId, request?.GoodsId); return ApiResponse.Fail("获取抽奖记录失败"); } } /// /// 道具卡抽奖(重抽) /// POST /api/item_card_chou /// Requirements: 6.1-6.4 /// [HttpPost("item_card_chou")] [Authorize] public async Task> DrawWithItemCard([FromBody] ItemCardDrawRequest? request) { var userId = GetCurrentUserId(); if (userId == null) { return ApiResponse.Unauthorized(); } try { if (request == null) { return ApiResponse.Fail("请求参数不能为空"); } if (request.GoodsId <= 0) { return ApiResponse.Fail("商品ID不能为空"); } if (string.IsNullOrWhiteSpace(request.OrderListIds)) { return ApiResponse.Fail("参数错误"); } // 解析订单项ID列表 var orderListIds = request.OrderListIds .Split(',', StringSplitOptions.RemoveEmptyEntries) .Select(s => int.TryParse(s.Trim(), out var id) ? id : 0) .Where(id => id > 0) .ToList(); if (!orderListIds.Any()) { return ApiResponse.Fail("参数错误"); } var result = await _lotteryService.DrawWithItemCardAsync(userId.Value, request.GoodsId, orderListIds); return ApiResponse.Success(result, "重抽成功"); } catch (InvalidOperationException ex) { _logger.LogWarning("Item card draw failed: UserId={UserId}, GoodsId={GoodsId}, Error={Error}", userId, request?.GoodsId, ex.Message); return ApiResponse.Fail(ex.Message); } catch (Exception ex) { _logger.LogError(ex, "Failed to draw with item card: UserId={UserId}, GoodsId={GoodsId}", userId, request?.GoodsId); return ApiResponse.Fail("重抽失败,请刷新重试"); } } #endregion #region 订单模块扩展 (9个接口) /// /// 获取订单支付状态 /// GET /api/get_order_status /// Requirements: 6.1 /// [HttpGet("get_order_status")] [Authorize] public async Task> GetOrderStatus([FromQuery] string order_num) { var userId = GetCurrentUserId(); if (userId == null) { return ApiResponse.Unauthorized(); } try { if (string.IsNullOrWhiteSpace(order_num)) { return ApiResponse.Fail("订单编号不能为空"); } var result = await _orderService.GetOrderStatusAsync(userId.Value, order_num); return ApiResponse.Success(result, result.Message); } catch (InvalidOperationException ex) { _logger.LogWarning("Get order status failed: UserId={UserId}, OrderNum={OrderNum}, Error={Error}", userId, order_num, ex.Message); return ApiResponse.Fail(ex.Message); } catch (Exception ex) { _logger.LogError(ex, "Failed to get order status: UserId={UserId}, OrderNum={OrderNum}", userId, order_num); return ApiResponse.Fail("获取订单状态失败"); } } /// /// 获取订单列表(GET方式) /// GET /api/get_order_list /// Requirements: 6.2 /// [HttpGet("get_order_list")] [Authorize] public async Task> GetOrderListByGet([FromQuery] int page = 1, [FromQuery] int page_size = 10) { var userId = GetCurrentUserId(); if (userId == null) { return ApiResponse.Unauthorized(); } try { var result = await _orderService.GetOrderListByGetAsync(userId.Value, page, page_size); return ApiResponse.Success(result, "获取成功"); } catch (Exception ex) { _logger.LogError(ex, "Failed to get order list: UserId={UserId}", userId); return ApiResponse.Fail("获取订单列表失败"); } } /// /// 创建网页支付订单 /// POST /api/create_web_pay_order /// Requirements: 6.3 /// [HttpPost("create_web_pay_order")] [Authorize] public async Task> CreateWebPayOrder([FromBody] CreateWebPayOrderRequest? request) { var userId = GetCurrentUserId(); if (userId == null) { return ApiResponse.Unauthorized(); } try { if (request == null || string.IsNullOrWhiteSpace(request.OrderNum)) { return ApiResponse.Fail("订单编号不能为空"); } var result = await _orderService.CreateWebPayOrderAsync(userId.Value, request.OrderNum); return ApiResponse.Success(result, "创建成功"); } catch (InvalidOperationException ex) { _logger.LogWarning("Create web pay order failed: UserId={UserId}, OrderNum={OrderNum}, Error={Error}", userId, request?.OrderNum, ex.Message); return ApiResponse.Fail(ex.Message); } catch (Exception ex) { _logger.LogError(ex, "Failed to create web pay order: UserId={UserId}, OrderNum={OrderNum}", userId, request?.OrderNum); return ApiResponse.Fail("创建支付订单失败"); } } /// /// 获取订单URL链接 /// GET /api/get_order_url_link /// Requirements: 6.4 /// [HttpGet("get_order_url_link")] public async Task> GetOrderUrlLink([FromQuery] string order_num) { try { if (string.IsNullOrWhiteSpace(order_num)) { return ApiResponse.Fail("订单编号不能为空"); } var result = await _orderService.GetOrderUrlLinkAsync(order_num); return ApiResponse.Success(result, "获取成功"); } catch (InvalidOperationException ex) { _logger.LogWarning("Get order url link failed: OrderNum={OrderNum}, Error={Error}", order_num, ex.Message); return ApiResponse.Fail(ex.Message); } catch (Exception ex) { _logger.LogError(ex, "Failed to get order url link: OrderNum={OrderNum}", order_num); return ApiResponse.Fail("获取失败"); } } /// /// 商城下单 /// POST /api/mall_orderbuy /// Requirements: 6.5 /// [HttpPost("mall_orderbuy")] [Authorize] public async Task> CreateMallOrder([FromBody] MallOrderBuyRequest? request) { var userId = GetCurrentUserId(); if (userId == null) { return ApiResponse.Unauthorized(); } try { if (request == null) { return ApiResponse.Fail("请求参数不能为空"); } if (request.GoodsId <= 0) { return ApiResponse.Fail("商品ID不能为空"); } if (request.PrizeNum <= 0) { return ApiResponse.Fail("抽奖次数不能为空"); } var result = await _orderService.CreateMallOrderAsync(userId.Value, request); return ApiResponse.Success(result, "下单成功"); } catch (InvalidOperationException ex) { _logger.LogWarning("Create mall order failed: UserId={UserId}, GoodsId={GoodsId}, Error={Error}", userId, request?.GoodsId, ex.Message); // 未绑定手机号返回特殊状态码 -9,前端根据此状态码跳转绑定页面 if (ex.Message.Contains("绑定手机号")) { return ApiResponse.Fail(ex.Message, -9); } return ApiResponse.Fail(ex.Message); } catch (Exception ex) { _logger.LogError(ex, "Failed to create mall order: UserId={UserId}, GoodsId={GoodsId}", userId, request?.GoodsId); return ApiResponse.Fail("购买失败,请刷新重试"); } } /// /// 获取抽奖结果(别名) /// POST /api/prize_order_log /// Requirements: 6.6 /// [HttpPost("prize_order_log")] [Authorize] public async Task> GetPrizeOrderLogAlias([FromBody] OrderPrizeOrderLogRequest? request) { // 复用已有的 prizeorderlog 接口逻辑 return await GetPrizeOrderLog(request); } /// /// 获取道具卡列表 /// GET /api/item_card_list /// Requirements: 6.7 /// [HttpGet("item_card_list")] [Authorize] public async Task> GetItemCardList([FromQuery] int page = 1, [FromQuery] int page_size = 20) { var userId = GetCurrentUserId(); if (userId == null) { return ApiResponse.Unauthorized(); } try { var result = await _orderService.GetItemCardListAsync(userId.Value, page, page_size); return ApiResponse.Success(result, "请求成功"); } catch (Exception ex) { _logger.LogError(ex, "Failed to get item card list: UserId={UserId}", userId); return ApiResponse.Fail("获取道具卡列表失败"); } } /// /// 连击赏秘宝下单 /// POST /api/infinite_mibao_orderbuy /// Requirements: 6.8 /// [HttpPost("infinite_mibao_orderbuy")] [Authorize] public async Task> CreateInfiniteMibaoOrder([FromBody] InfiniteMibaoOrderBuyRequest? request) { var userId = GetCurrentUserId(); if (userId == null) { return ApiResponse.Unauthorized(); } try { if (request == null) { return ApiResponse.Fail("请求参数不能为空"); } if (request.GoodsId <= 0) { return ApiResponse.Fail("商品ID不能为空"); } if (request.PrizeNum <= 0) { return ApiResponse.Fail("抽奖次数不能为空"); } var result = await _orderService.CreateInfiniteMibaoOrderAsync(userId.Value, request); return ApiResponse.Success(result, "下单成功"); } catch (InvalidOperationException ex) { _logger.LogWarning("Create infinite mibao order failed: UserId={UserId}, GoodsId={GoodsId}, Error={Error}", userId, request?.GoodsId, ex.Message); // 未绑定手机号返回特殊状态码 -9,前端根据此状态码跳转绑定页面 if (ex.Message.Contains("绑定手机号")) { return ApiResponse.Fail(ex.Message, -9); } return ApiResponse.Fail(ex.Message); } catch (Exception ex) { _logger.LogError(ex, "Failed to create infinite mibao order: UserId={UserId}, GoodsId={GoodsId}", userId, request?.GoodsId); return ApiResponse.Fail("购买失败,请刷新重试"); } } /// /// 获取测试用户Token(仅测试环境) /// GET /api/get_user_test /// Requirements: 6.9 /// [HttpGet("get_user_test")] [Authorize] public async Task> GetUserTest([FromQuery] int user_id) { var userId = GetCurrentUserId(); if (userId == null) { return ApiResponse.Unauthorized(); } try { var result = await _orderService.GetUserTestTokenAsync(userId.Value, user_id); if (string.IsNullOrEmpty(result)) { return ApiResponse.Success(string.Empty, "获取失败"); } return ApiResponse.Success(result, "获取成功"); } catch (Exception ex) { _logger.LogError(ex, "Failed to get user test token: UserId={UserId}, TargetUserId={TargetUserId}", userId, user_id); return ApiResponse.Success(string.Empty, "获取失败"); } } #endregion #region Private Helper Methods /// /// 获取当前登录用户ID /// private int? GetCurrentUserId() { var userIdClaim = User.FindFirst(ClaimTypes.NameIdentifier); if (userIdClaim == null || !int.TryParse(userIdClaim.Value, out var userId)) { return null; } return userId; } #endregion }