HaniBlindBox/server/HoneyBox/src/HoneyBox.Api/Controllers/OrderController.cs
2026-01-27 18:24:03 +08:00

974 lines
34 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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;
/// <summary>
/// 订单控制器 - 处理订单创建、查询和抽奖结果
/// </summary>
/// <remarks>
/// 提供一番赏、无限赏、商城等订单的创建、金额计算、查询和抽奖结果查询功能
/// </remarks>
[ApiController]
[Route("api")]
public class OrderController : ControllerBase
{
private readonly IOrderService _orderService;
private readonly ILotteryService _lotteryService;
private readonly ILogger<OrderController> _logger;
public OrderController(
IOrderService orderService,
ILotteryService lotteryService,
ILogger<OrderController> logger)
{
_orderService = orderService;
_lotteryService = lotteryService;
_logger = logger;
}
#region
/// <summary>
/// 一番赏订单金额计算
/// </summary>
/// <remarks>
/// POST /api/ordermoney
///
/// 计算一番赏订单金额,包含优惠券抵扣、余额抵扣等
/// Requirements: 1.1-1.6
/// </remarks>
/// <param name="request">订单金额计算请求参数</param>
/// <returns>订单金额计算结果</returns>
[HttpPost("ordermoney")]
[Authorize]
[ProducesResponseType(typeof(ApiResponse<OrderCalculationDto>), StatusCodes.Status200OK)]
[ProducesResponseType(typeof(ApiResponse<OrderCalculationDto>), StatusCodes.Status401Unauthorized)]
public async Task<ApiResponse<OrderCalculationDto>> CalculateOrderMoney([FromBody] OrderMoneyRequest? request)
{
var userId = GetCurrentUserId();
if (userId == null)
{
return ApiResponse<OrderCalculationDto>.Unauthorized();
}
try
{
if (request == null)
{
return ApiResponse<OrderCalculationDto>.Fail("请求参数不能为空");
}
if (request.GoodsId <= 0)
{
return ApiResponse<OrderCalculationDto>.Fail("商品ID不能为空");
}
if (request.PrizeNum <= 0)
{
return ApiResponse<OrderCalculationDto>.Fail("抽奖次数不能为空");
}
var result = await _orderService.CalculateOrderMoneyAsync(userId.Value, request);
return ApiResponse<OrderCalculationDto>.Success(result);
}
catch (InvalidOperationException ex)
{
_logger.LogWarning("Calculate order money failed: UserId={UserId}, GoodsId={GoodsId}, Error={Error}",
userId, request?.GoodsId, ex.Message);
return ApiResponse<OrderCalculationDto>.Fail(ex.Message);
}
catch (Exception ex)
{
_logger.LogError(ex, "Failed to calculate order money: UserId={UserId}, GoodsId={GoodsId}",
userId, request?.GoodsId);
return ApiResponse<OrderCalculationDto>.Fail("计算订单金额失败");
}
}
/// <summary>
/// 一番赏订单创建
/// </summary>
/// <remarks>
/// POST /api/orderbuy
///
/// 创建一番赏订单并执行抽奖,返回订单信息和抽奖结果
/// Requirements: 2.1-2.6
/// </remarks>
/// <param name="request">订单创建请求参数</param>
/// <returns>订单创建结果,包含订单号和支付信息</returns>
[HttpPost("orderbuy")]
[Authorize]
[ProducesResponseType(typeof(ApiResponse<OrderBuyResponseDto>), StatusCodes.Status200OK)]
[ProducesResponseType(typeof(ApiResponse<OrderBuyResponseDto>), StatusCodes.Status401Unauthorized)]
public async Task<ApiResponse<OrderBuyResponseDto>> CreateOrder([FromBody] OrderBuyRequest? request)
{
var userId = GetCurrentUserId();
if (userId == null)
{
return ApiResponse<OrderBuyResponseDto>.Unauthorized();
}
try
{
if (request == null)
{
return ApiResponse<OrderBuyResponseDto>.Fail("请求参数不能为空");
}
if (request.GoodsId <= 0)
{
return ApiResponse<OrderBuyResponseDto>.Fail("商品ID不能为空");
}
if (request.PrizeNum <= 0)
{
return ApiResponse<OrderBuyResponseDto>.Fail("抽奖次数不能为空");
}
var result = await _orderService.CreateOrderAsync(userId.Value, request);
return ApiResponse<OrderBuyResponseDto>.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<OrderBuyResponseDto>.Fail(ex.Message, -9);
}
return ApiResponse<OrderBuyResponseDto>.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<OrderBuyResponseDto>.Fail($"创建订单失败: {ex.Message}");
}
}
#endregion
#region
/// <summary>
/// 无限赏订单金额计算
/// POST /api/infinite_ordermoney
/// Requirements: 3.1-3.3
/// </summary>
[HttpPost("infinite_ordermoney")]
[Authorize]
public async Task<ApiResponse<OrderCalculationDto>> CalculateInfiniteOrderMoney([FromBody] InfiniteOrderMoneyRequest? request)
{
var userId = GetCurrentUserId();
if (userId == null)
{
return ApiResponse<OrderCalculationDto>.Unauthorized();
}
try
{
if (request == null)
{
return ApiResponse<OrderCalculationDto>.Fail("请求参数不能为空");
}
if (request.GoodsId <= 0)
{
return ApiResponse<OrderCalculationDto>.Fail("商品ID不能为空");
}
if (request.PrizeNum <= 0)
{
return ApiResponse<OrderCalculationDto>.Fail("抽奖次数不能为空");
}
var result = await _orderService.CalculateInfiniteOrderMoneyAsync(userId.Value, request);
return ApiResponse<OrderCalculationDto>.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<OrderCalculationDto>.Fail(ex.Message);
}
catch (Exception ex)
{
_logger.LogError(ex, "Failed to calculate infinite order money: UserId={UserId}, GoodsId={GoodsId}",
userId, request?.GoodsId);
return ApiResponse<OrderCalculationDto>.Fail("计算订单金额失败");
}
}
/// <summary>
/// 无限赏订单创建
/// POST /api/infinite_orderbuy
/// Requirements: 4.1-4.3
/// </summary>
[HttpPost("infinite_orderbuy")]
[Authorize]
public async Task<ApiResponse<OrderBuyResponseDto>> CreateInfiniteOrder([FromBody] InfiniteOrderBuyRequest? request)
{
var userId = GetCurrentUserId();
if (userId == null)
{
return ApiResponse<OrderBuyResponseDto>.Unauthorized();
}
try
{
if (request == null)
{
return ApiResponse<OrderBuyResponseDto>.Fail("请求参数不能为空");
}
if (request.GoodsId <= 0)
{
return ApiResponse<OrderBuyResponseDto>.Fail("商品ID不能为空");
}
if (request.PrizeNum <= 0)
{
return ApiResponse<OrderBuyResponseDto>.Fail("抽奖次数不能为空");
}
var result = await _orderService.CreateInfiniteOrderAsync(userId.Value, request);
return ApiResponse<OrderBuyResponseDto>.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<OrderBuyResponseDto>.Fail(ex.Message, -9);
}
return ApiResponse<OrderBuyResponseDto>.Fail(ex.Message);
}
catch (Exception ex)
{
_logger.LogError(ex, "Failed to create infinite order: UserId={UserId}, GoodsId={GoodsId}",
userId, request?.GoodsId);
return ApiResponse<OrderBuyResponseDto>.Fail("创建订单失败");
}
}
#endregion
#region
/// <summary>
/// 商城订单金额计算
/// POST /api/mall_ordermoney
/// Requirements: 5.1-5.3
/// </summary>
[HttpPost("mall_ordermoney")]
[Authorize]
public async Task<ApiResponse<OrderCalculationDto>> CalculateMallOrderMoney([FromBody] MallOrderMoneyRequest? request)
{
var userId = GetCurrentUserId();
if (userId == null)
{
return ApiResponse<OrderCalculationDto>.Unauthorized();
}
try
{
if (request == null)
{
return ApiResponse<OrderCalculationDto>.Fail("请求参数不能为空");
}
if (request.GoodsId <= 0)
{
return ApiResponse<OrderCalculationDto>.Fail("商品ID不能为空");
}
var result = await _orderService.CalculateMallOrderMoneyAsync(userId.Value, request);
return ApiResponse<OrderCalculationDto>.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<OrderCalculationDto>.Fail(ex.Message);
}
catch (Exception ex)
{
_logger.LogError(ex, "Failed to calculate mall order money: UserId={UserId}, GoodsId={GoodsId}",
userId, request?.GoodsId);
return ApiResponse<OrderCalculationDto>.Fail("计算订单金额失败");
}
}
#endregion
#region
/// <summary>
/// 订单列表查询
/// </summary>
/// <remarks>
/// POST /api/order_list
///
/// 获取当前用户的订单列表,支持按状态筛选和分页
/// Requirements: 6.1-6.4
/// </remarks>
/// <param name="request">订单列表请求参数</param>
/// <returns>订单列表分页数据</returns>
[HttpPost("order_list")]
[Authorize]
[ProducesResponseType(typeof(ApiResponse<PageResponse<OrderListDto>>), StatusCodes.Status200OK)]
[ProducesResponseType(typeof(ApiResponse<PageResponse<OrderListDto>>), StatusCodes.Status401Unauthorized)]
public async Task<ApiResponse<PageResponse<OrderListDto>>> GetOrderList([FromBody] OrderListRequest? request)
{
var userId = GetCurrentUserId();
if (userId == null)
{
return ApiResponse<PageResponse<OrderListDto>>.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<PageResponse<OrderListDto>>.Success(result);
}
catch (Exception ex)
{
_logger.LogError(ex, "Failed to get order list: UserId={UserId}", userId);
return ApiResponse<PageResponse<OrderListDto>>.Fail("获取订单列表失败");
}
}
/// <summary>
/// 订单详情查询
/// POST /api/order_detail
/// Requirements: 7.1-7.3
/// </summary>
[HttpPost("order_detail")]
[Authorize]
public async Task<ApiResponse<OrderInfoDto>> GetOrderDetail([FromBody] OrderDetailRequest? request)
{
var userId = GetCurrentUserId();
if (userId == null)
{
return ApiResponse<OrderInfoDto>.Unauthorized();
}
try
{
if (request == null || string.IsNullOrWhiteSpace(request.OrderNum))
{
return ApiResponse<OrderInfoDto>.Fail("订单号不能为空");
}
var result = await _orderService.GetOrderDetailAsync(userId.Value, request.OrderNum);
return ApiResponse<OrderInfoDto>.Success(result);
}
catch (InvalidOperationException ex)
{
_logger.LogWarning("Get order detail failed: UserId={UserId}, OrderNum={OrderNum}, Error={Error}",
userId, request?.OrderNum, ex.Message);
return ApiResponse<OrderInfoDto>.Fail(ex.Message);
}
catch (Exception ex)
{
_logger.LogError(ex, "Failed to get order detail: UserId={UserId}, OrderNum={OrderNum}",
userId, request?.OrderNum);
return ApiResponse<OrderInfoDto>.Fail("获取订单详情失败");
}
}
#endregion
#region
/// <summary>
/// 一番赏抽奖结果查询
/// POST /api/prizeorderlog
/// Requirements: 8.1-8.3
/// </summary>
[HttpPost("prizeorderlog")]
[Authorize]
public async Task<ApiResponse<PrizeOrderLogResponseDto>> GetPrizeOrderLog([FromBody] OrderPrizeOrderLogRequest? request)
{
var userId = GetCurrentUserId();
if (userId == null)
{
return ApiResponse<PrizeOrderLogResponseDto>.Unauthorized();
}
try
{
if (request == null || string.IsNullOrWhiteSpace(request.OrderNum))
{
return ApiResponse<PrizeOrderLogResponseDto>.Fail("订单号不能为空");
}
var result = await _orderService.GetPrizeOrderLogAsync(userId.Value, request.OrderNum);
return ApiResponse<PrizeOrderLogResponseDto>.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<PrizeOrderLogResponseDto>.Fail(ex.Message);
}
catch (Exception ex)
{
_logger.LogError(ex, "Failed to get prize order log: UserId={UserId}, OrderNum={OrderNum}",
userId, request?.OrderNum);
return ApiResponse<PrizeOrderLogResponseDto>.Fail("获取抽奖结果失败");
}
}
/// <summary>
/// 无限赏抽奖结果查询
/// POST /api/infinite_prizeorderlog
/// Requirements: 9.1-9.2
/// </summary>
[HttpPost("infinite_prizeorderlog")]
[Authorize]
public async Task<ApiResponse<InfinitePrizeOrderLogResponseDto>> GetInfinitePrizeOrderLog([FromBody] OrderPrizeOrderLogRequest? request)
{
var userId = GetCurrentUserId();
if (userId == null)
{
return ApiResponse<InfinitePrizeOrderLogResponseDto>.Unauthorized();
}
try
{
if (request == null || string.IsNullOrWhiteSpace(request.OrderNum))
{
return ApiResponse<InfinitePrizeOrderLogResponseDto>.Fail("订单号不能为空");
}
var result = await _orderService.GetInfinitePrizeOrderLogAsync(userId.Value, request.OrderNum);
return ApiResponse<InfinitePrizeOrderLogResponseDto>.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<InfinitePrizeOrderLogResponseDto>.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<InfinitePrizeOrderLogResponseDto>.Fail("获取抽奖结果失败");
}
}
/// <summary>
/// 无限赏中奖记录查询
/// GET /api/infinite_shang_log
/// Requirements: 4.1-4.3
/// </summary>
[HttpGet("infinite_shang_log")]
public async Task<ApiResponse<InfiniteShangLogResponseDto>> GetInfiniteShangLog([FromQuery] InfiniteShangLogRequest? request)
{
try
{
if (request == null || request.GoodsId <= 0)
{
return ApiResponse<InfiniteShangLogResponseDto>.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<InfiniteShangLogResponseDto>.Success(result);
}
catch (InvalidOperationException ex)
{
_logger.LogWarning("Get infinite shang log failed: GoodsId={GoodsId}, Error={Error}",
request?.GoodsId, ex.Message);
return ApiResponse<InfiniteShangLogResponseDto>.Fail(ex.Message);
}
catch (Exception ex)
{
_logger.LogError(ex, "Failed to get infinite shang log: GoodsId={GoodsId}",
request?.GoodsId);
return ApiResponse<InfiniteShangLogResponseDto>.Fail("获取中奖记录失败");
}
}
/// <summary>
/// 无限赏用户抽奖记录查询(盒子抽奖记录)
/// POST /api/infinite_prizerecords
/// Requirements: 5.1-5.3
/// </summary>
[HttpPost("infinite_prizerecords")]
[Authorize]
public async Task<ApiResponse<InfinitePrizeRecordsResponseDto>> GetInfinitePrizeRecords([FromBody] InfinitePrizeRecordsRequest? request)
{
var userId = GetCurrentUserId();
if (userId == null)
{
return ApiResponse<InfinitePrizeRecordsResponseDto>.Unauthorized();
}
try
{
if (request == null || request.GoodsId <= 0)
{
return ApiResponse<InfinitePrizeRecordsResponseDto>.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<InfinitePrizeRecordsResponseDto>.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<InfinitePrizeRecordsResponseDto>.Fail(ex.Message);
}
catch (Exception ex)
{
_logger.LogError(ex, "Failed to get infinite prize records: UserId={UserId}, GoodsId={GoodsId}",
userId, request?.GoodsId);
return ApiResponse<InfinitePrizeRecordsResponseDto>.Fail("获取抽奖记录失败");
}
}
/// <summary>
/// 道具卡抽奖(重抽)
/// POST /api/item_card_chou
/// Requirements: 6.1-6.4
/// </summary>
[HttpPost("item_card_chou")]
[Authorize]
public async Task<ApiResponse<ItemCardDrawResponseDto>> DrawWithItemCard([FromBody] ItemCardDrawRequest? request)
{
var userId = GetCurrentUserId();
if (userId == null)
{
return ApiResponse<ItemCardDrawResponseDto>.Unauthorized();
}
try
{
if (request == null)
{
return ApiResponse<ItemCardDrawResponseDto>.Fail("请求参数不能为空");
}
if (request.GoodsId <= 0)
{
return ApiResponse<ItemCardDrawResponseDto>.Fail("商品ID不能为空");
}
if (string.IsNullOrWhiteSpace(request.OrderListIds))
{
return ApiResponse<ItemCardDrawResponseDto>.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<ItemCardDrawResponseDto>.Fail("参数错误");
}
var result = await _lotteryService.DrawWithItemCardAsync(userId.Value, request.GoodsId, orderListIds);
return ApiResponse<ItemCardDrawResponseDto>.Success(result, "重抽成功");
}
catch (InvalidOperationException ex)
{
_logger.LogWarning("Item card draw failed: UserId={UserId}, GoodsId={GoodsId}, Error={Error}",
userId, request?.GoodsId, ex.Message);
return ApiResponse<ItemCardDrawResponseDto>.Fail(ex.Message);
}
catch (Exception ex)
{
_logger.LogError(ex, "Failed to draw with item card: UserId={UserId}, GoodsId={GoodsId}",
userId, request?.GoodsId);
return ApiResponse<ItemCardDrawResponseDto>.Fail("重抽失败,请刷新重试");
}
}
#endregion
#region (9)
/// <summary>
/// 获取订单支付状态
/// GET /api/get_order_status
/// Requirements: 6.1
/// </summary>
[HttpGet("get_order_status")]
[Authorize]
public async Task<ApiResponse<OrderStatusResponseDto>> GetOrderStatus([FromQuery] string order_num)
{
var userId = GetCurrentUserId();
if (userId == null)
{
return ApiResponse<OrderStatusResponseDto>.Unauthorized();
}
try
{
if (string.IsNullOrWhiteSpace(order_num))
{
return ApiResponse<OrderStatusResponseDto>.Fail("订单编号不能为空");
}
var result = await _orderService.GetOrderStatusAsync(userId.Value, order_num);
return ApiResponse<OrderStatusResponseDto>.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<OrderStatusResponseDto>.Fail(ex.Message);
}
catch (Exception ex)
{
_logger.LogError(ex, "Failed to get order status: UserId={UserId}, OrderNum={OrderNum}",
userId, order_num);
return ApiResponse<OrderStatusResponseDto>.Fail("获取订单状态失败");
}
}
/// <summary>
/// 获取订单列表GET方式
/// GET /api/get_order_list
/// Requirements: 6.2
/// </summary>
[HttpGet("get_order_list")]
[Authorize]
public async Task<ApiResponse<GetOrderListResponseDto>> GetOrderListByGet([FromQuery] int page = 1, [FromQuery] int page_size = 10)
{
var userId = GetCurrentUserId();
if (userId == null)
{
return ApiResponse<GetOrderListResponseDto>.Unauthorized();
}
try
{
var result = await _orderService.GetOrderListByGetAsync(userId.Value, page, page_size);
return ApiResponse<GetOrderListResponseDto>.Success(result, "获取成功");
}
catch (Exception ex)
{
_logger.LogError(ex, "Failed to get order list: UserId={UserId}", userId);
return ApiResponse<GetOrderListResponseDto>.Fail("获取订单列表失败");
}
}
/// <summary>
/// 创建网页支付订单
/// POST /api/create_web_pay_order
/// Requirements: 6.3
/// </summary>
[HttpPost("create_web_pay_order")]
[Authorize]
public async Task<ApiResponse<WebPayOrderResponseDto>> CreateWebPayOrder([FromBody] CreateWebPayOrderRequest? request)
{
var userId = GetCurrentUserId();
if (userId == null)
{
return ApiResponse<WebPayOrderResponseDto>.Unauthorized();
}
try
{
if (request == null || string.IsNullOrWhiteSpace(request.OrderNum))
{
return ApiResponse<WebPayOrderResponseDto>.Fail("订单编号不能为空");
}
var result = await _orderService.CreateWebPayOrderAsync(userId.Value, request.OrderNum);
return ApiResponse<WebPayOrderResponseDto>.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<WebPayOrderResponseDto>.Fail(ex.Message);
}
catch (Exception ex)
{
_logger.LogError(ex, "Failed to create web pay order: UserId={UserId}, OrderNum={OrderNum}",
userId, request?.OrderNum);
return ApiResponse<WebPayOrderResponseDto>.Fail("创建支付订单失败");
}
}
/// <summary>
/// 获取订单URL链接
/// GET /api/get_order_url_link
/// Requirements: 6.4
/// </summary>
[HttpGet("get_order_url_link")]
public async Task<ApiResponse<OrderUrlLinkResponseDto>> GetOrderUrlLink([FromQuery] string order_num)
{
try
{
if (string.IsNullOrWhiteSpace(order_num))
{
return ApiResponse<OrderUrlLinkResponseDto>.Fail("订单编号不能为空");
}
var result = await _orderService.GetOrderUrlLinkAsync(order_num);
return ApiResponse<OrderUrlLinkResponseDto>.Success(result, "获取成功");
}
catch (InvalidOperationException ex)
{
_logger.LogWarning("Get order url link failed: OrderNum={OrderNum}, Error={Error}",
order_num, ex.Message);
return ApiResponse<OrderUrlLinkResponseDto>.Fail(ex.Message);
}
catch (Exception ex)
{
_logger.LogError(ex, "Failed to get order url link: OrderNum={OrderNum}", order_num);
return ApiResponse<OrderUrlLinkResponseDto>.Fail("获取失败");
}
}
/// <summary>
/// 商城下单
/// POST /api/mall_orderbuy
/// Requirements: 6.5
/// </summary>
[HttpPost("mall_orderbuy")]
[Authorize]
public async Task<ApiResponse<OrderBuyResponseDto>> CreateMallOrder([FromBody] MallOrderBuyRequest? request)
{
var userId = GetCurrentUserId();
if (userId == null)
{
return ApiResponse<OrderBuyResponseDto>.Unauthorized();
}
try
{
if (request == null)
{
return ApiResponse<OrderBuyResponseDto>.Fail("请求参数不能为空");
}
if (request.GoodsId <= 0)
{
return ApiResponse<OrderBuyResponseDto>.Fail("商品ID不能为空");
}
if (request.PrizeNum <= 0)
{
return ApiResponse<OrderBuyResponseDto>.Fail("抽奖次数不能为空");
}
var result = await _orderService.CreateMallOrderAsync(userId.Value, request);
return ApiResponse<OrderBuyResponseDto>.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<OrderBuyResponseDto>.Fail(ex.Message, -9);
}
return ApiResponse<OrderBuyResponseDto>.Fail(ex.Message);
}
catch (Exception ex)
{
_logger.LogError(ex, "Failed to create mall order: UserId={UserId}, GoodsId={GoodsId}",
userId, request?.GoodsId);
return ApiResponse<OrderBuyResponseDto>.Fail("购买失败,请刷新重试");
}
}
/// <summary>
/// 获取抽奖结果(别名)
/// POST /api/prize_order_log
/// Requirements: 6.6
/// </summary>
[HttpPost("prize_order_log")]
[Authorize]
public async Task<ApiResponse<PrizeOrderLogResponseDto>> GetPrizeOrderLogAlias([FromBody] OrderPrizeOrderLogRequest? request)
{
// 复用已有的 prizeorderlog 接口逻辑
return await GetPrizeOrderLog(request);
}
/// <summary>
/// 获取道具卡列表
/// GET /api/item_card_list
/// Requirements: 6.7
/// </summary>
[HttpGet("item_card_list")]
[Authorize]
public async Task<ApiResponse<ItemCardListResponseDto>> GetItemCardList([FromQuery] int page = 1, [FromQuery] int page_size = 20)
{
var userId = GetCurrentUserId();
if (userId == null)
{
return ApiResponse<ItemCardListResponseDto>.Unauthorized();
}
try
{
var result = await _orderService.GetItemCardListAsync(userId.Value, page, page_size);
return ApiResponse<ItemCardListResponseDto>.Success(result, "请求成功");
}
catch (Exception ex)
{
_logger.LogError(ex, "Failed to get item card list: UserId={UserId}", userId);
return ApiResponse<ItemCardListResponseDto>.Fail("获取道具卡列表失败");
}
}
/// <summary>
/// 连击赏秘宝下单
/// POST /api/infinite_mibao_orderbuy
/// Requirements: 6.8
/// </summary>
[HttpPost("infinite_mibao_orderbuy")]
[Authorize]
public async Task<ApiResponse<OrderBuyResponseDto>> CreateInfiniteMibaoOrder([FromBody] InfiniteMibaoOrderBuyRequest? request)
{
var userId = GetCurrentUserId();
if (userId == null)
{
return ApiResponse<OrderBuyResponseDto>.Unauthorized();
}
try
{
if (request == null)
{
return ApiResponse<OrderBuyResponseDto>.Fail("请求参数不能为空");
}
if (request.GoodsId <= 0)
{
return ApiResponse<OrderBuyResponseDto>.Fail("商品ID不能为空");
}
if (request.PrizeNum <= 0)
{
return ApiResponse<OrderBuyResponseDto>.Fail("抽奖次数不能为空");
}
var result = await _orderService.CreateInfiniteMibaoOrderAsync(userId.Value, request);
return ApiResponse<OrderBuyResponseDto>.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<OrderBuyResponseDto>.Fail(ex.Message, -9);
}
return ApiResponse<OrderBuyResponseDto>.Fail(ex.Message);
}
catch (Exception ex)
{
_logger.LogError(ex, "Failed to create infinite mibao order: UserId={UserId}, GoodsId={GoodsId}",
userId, request?.GoodsId);
return ApiResponse<OrderBuyResponseDto>.Fail("购买失败,请刷新重试");
}
}
/// <summary>
/// 获取测试用户Token仅测试环境
/// GET /api/get_user_test
/// Requirements: 6.9
/// </summary>
[HttpGet("get_user_test")]
[Authorize]
public async Task<ApiResponse<string>> GetUserTest([FromQuery] int user_id)
{
var userId = GetCurrentUserId();
if (userId == null)
{
return ApiResponse<string>.Unauthorized();
}
try
{
var result = await _orderService.GetUserTestTokenAsync(userId.Value, user_id);
if (string.IsNullOrEmpty(result))
{
return ApiResponse<string>.Success(string.Empty, "获取失败");
}
return ApiResponse<string>.Success(result, "获取成功");
}
catch (Exception ex)
{
_logger.LogError(ex, "Failed to get user test token: UserId={UserId}, TargetUserId={TargetUserId}",
userId, user_id);
return ApiResponse<string>.Success(string.Empty, "获取失败");
}
}
#endregion
#region Private Helper Methods
/// <summary>
/// 获取当前登录用户ID
/// </summary>
private int? GetCurrentUserId()
{
var userIdClaim = User.FindFirst(ClaimTypes.NameIdentifier);
if (userIdClaim == null || !int.TryParse(userIdClaim.Value, out var userId))
{
return null;
}
return userId;
}
#endregion
}