HaniBlindBox/server/C#/HoneyBox/src/HoneyBox.Api/Controllers/GoodsController.cs
2026-01-02 20:31:24 +08:00

350 lines
11 KiB
C#

using System.Security.Claims;
using HoneyBox.Core.Interfaces;
using HoneyBox.Model.Base;
using HoneyBox.Model.Models;
using HoneyBox.Model.Models.Goods;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
namespace HoneyBox.Api.Controllers;
/// <summary>
/// 商品控制器
/// </summary>
[ApiController]
[Route("api")]
public class GoodsController : ControllerBase
{
private readonly IGoodsService _goodsService;
private readonly IPrizeService _prizeService;
private readonly ILogger<GoodsController> _logger;
public GoodsController(
IGoodsService goodsService,
IPrizeService prizeService,
ILogger<GoodsController> logger)
{
_goodsService = goodsService;
_prizeService = prizeService;
_logger = logger;
}
/// <summary>
/// 获取商品列表
/// POST /api/goods_list
/// Requirements: 1.1-1.6
/// </summary>
[HttpPost("goods_list")]
[Authorize]
public async Task<ApiResponse<PageResponse<GoodsListDto>>> GetGoodsList([FromBody] GoodsListRequest? request)
{
var userId = GetCurrentUserId();
if (userId == null)
{
return ApiResponse<PageResponse<GoodsListDto>>.Unauthorized();
}
try
{
request ??= new GoodsListRequest();
if (request.Page < 1) request.Page = 1;
if (request.PageSize < 1) request.PageSize = 15;
var result = await _goodsService.GetGoodsListAsync(request, userId.Value);
return ApiResponse<PageResponse<GoodsListDto>>.Success(result);
}
catch (Exception ex)
{
_logger.LogError(ex, "Failed to get goods list: UserId={UserId}", userId);
return ApiResponse<PageResponse<GoodsListDto>>.Fail("获取商品列表失败");
}
}
/// <summary>
/// 获取商品详情
/// POST /api/goods_detail
/// Requirements: 2.1-2.7
/// </summary>
[HttpPost("goods_detail")]
[Authorize]
public async Task<ApiResponse<GoodsDetailResponseDto>> GetGoodsDetail([FromBody] GoodsDetailRequest? request)
{
var userId = GetCurrentUserId();
if (userId == null)
{
return ApiResponse<GoodsDetailResponseDto>.Unauthorized();
}
try
{
if (request == null || request.GoodsId <= 0)
{
return ApiResponse<GoodsDetailResponseDto>.Fail("商品ID不能为空");
}
var result = await _goodsService.GetGoodsDetailAsync(request.GoodsId, request.GoodsNum, userId.Value);
return ApiResponse<GoodsDetailResponseDto>.Success(result);
}
catch (InvalidOperationException ex)
{
_logger.LogWarning("Get goods detail failed: GoodsId={GoodsId}, Error={Error}", request?.GoodsId, ex.Message);
return ApiResponse<GoodsDetailResponseDto>.Fail(ex.Message);
}
catch (Exception ex)
{
_logger.LogError(ex, "Failed to get goods detail: GoodsId={GoodsId}", request?.GoodsId);
return ApiResponse<GoodsDetailResponseDto>.Fail("获取商品详情失败");
}
}
/// <summary>
/// 获取商品子奖品列表
/// POST /api/goods_children
/// Requirements: 3.1-3.3
/// </summary>
[HttpPost("goods_children")]
[Authorize]
public async Task<ApiResponse<List<GoodsChildrenDto>>> GetGoodsChildren([FromBody] GoodsChildrenRequest? request)
{
var userId = GetCurrentUserId();
if (userId == null)
{
return ApiResponse<List<GoodsChildrenDto>>.Unauthorized();
}
try
{
if (request == null || request.GoodsId <= 0 || request.GoodsListId <= 0)
{
return ApiResponse<List<GoodsChildrenDto>>.Fail("参数不能为空");
}
var result = await _goodsService.GetGoodsChildrenAsync(request.GoodsId, request.GoodsNum, request.GoodsListId);
return ApiResponse<List<GoodsChildrenDto>>.Success(result);
}
catch (Exception ex)
{
_logger.LogError(ex, "Failed to get goods children: GoodsId={GoodsId}, GoodsListId={GoodsListId}",
request?.GoodsId, request?.GoodsListId);
return ApiResponse<List<GoodsChildrenDto>>.Fail("获取子奖品列表失败");
}
}
/// <summary>
/// 获取商品扩展配置
/// POST /api/goods_extend
/// Requirements: 4.1-4.3
/// </summary>
[HttpPost("goods_extend")]
[Authorize]
public async Task<ApiResponse<GoodsExtendDto>> GetGoodsExtend([FromBody] GoodsExtendRequest? request)
{
var userId = GetCurrentUserId();
if (userId == null)
{
return ApiResponse<GoodsExtendDto>.Unauthorized();
}
try
{
if (request == null || request.GoodsId <= 0)
{
return ApiResponse<GoodsExtendDto>.Fail("商品ID不能为空");
}
var result = await _goodsService.GetGoodsExtendAsync(request.GoodsId, request.GoodsType);
return ApiResponse<GoodsExtendDto>.Success(result);
}
catch (Exception ex)
{
_logger.LogError(ex, "Failed to get goods extend: GoodsId={GoodsId}", request?.GoodsId);
return ApiResponse<GoodsExtendDto>.Fail("获取商品扩展配置失败");
}
}
/// <summary>
/// 获取箱号列表
/// POST /api/goods_num_list
/// Requirements: 5.1
/// </summary>
[HttpPost("goods_num_list")]
[Authorize]
public async Task<ApiResponse<List<BoxGroupDto>>> GetBoxList([FromBody] BoxListRequest? request)
{
var userId = GetCurrentUserId();
if (userId == null)
{
return ApiResponse<List<BoxGroupDto>>.Unauthorized();
}
try
{
if (request == null || request.GoodsId <= 0)
{
return ApiResponse<List<BoxGroupDto>>.Fail("商品ID不能为空");
}
var result = await _goodsService.GetBoxListAsync(request.GoodsId);
return ApiResponse<List<BoxGroupDto>>.Success(result);
}
catch (Exception ex)
{
_logger.LogError(ex, "Failed to get box list: GoodsId={GoodsId}", request?.GoodsId);
return ApiResponse<List<BoxGroupDto>>.Fail("获取箱号列表失败");
}
}
/// <summary>
/// 获取箱号详情
/// POST /api/goods_num_detail
/// Requirements: 5.2-5.4
/// </summary>
[HttpPost("goods_num_detail")]
[Authorize]
public async Task<ApiResponse<List<BoxDetailDto>>> GetBoxDetail([FromBody] BoxDetailRequest? request)
{
var userId = GetCurrentUserId();
if (userId == null)
{
return ApiResponse<List<BoxDetailDto>>.Unauthorized();
}
try
{
if (request == null || request.GoodsId <= 0)
{
return ApiResponse<List<BoxDetailDto>>.Fail("商品ID不能为空");
}
var result = await _goodsService.GetBoxDetailAsync(request.GoodsId, request.PageNo, request.Sort);
return ApiResponse<List<BoxDetailDto>>.Success(result);
}
catch (Exception ex)
{
_logger.LogError(ex, "Failed to get box detail: GoodsId={GoodsId}", request?.GoodsId);
return ApiResponse<List<BoxDetailDto>>.Fail("获取箱号详情失败");
}
}
/// <summary>
/// 获取奖品数量统计
/// POST /api/goods_prize_count
/// Requirements: 7.1
/// </summary>
[HttpPost("goods_prize_count")]
[Authorize]
public async Task<ApiResponse<PrizeCountResponseDto>> GetPrizeCount([FromBody] PrizeCountRequest? request)
{
var userId = GetCurrentUserId();
if (userId == null)
{
return ApiResponse<PrizeCountResponseDto>.Unauthorized();
}
try
{
if (request == null || request.GoodsId <= 0)
{
return ApiResponse<PrizeCountResponseDto>.Fail("商品ID不能为空");
}
var result = await _prizeService.GetPrizeCountAsync(request.GoodsId);
return ApiResponse<PrizeCountResponseDto>.Success(result);
}
catch (Exception ex)
{
_logger.LogError(ex, "Failed to get prize count: GoodsId={GoodsId}", request?.GoodsId);
return ApiResponse<PrizeCountResponseDto>.Fail("获取奖品统计失败");
}
}
/// <summary>
/// 获取奖品内容
/// POST /api/goods_prize_content
/// Requirements: 7.2
/// </summary>
[HttpPost("goods_prize_content")]
[Authorize]
public async Task<ApiResponse<PrizeContentResponseDto>> GetPrizeContent([FromBody] PrizeContentRequest? request)
{
var userId = GetCurrentUserId();
if (userId == null)
{
return ApiResponse<PrizeContentResponseDto>.Unauthorized();
}
try
{
if (request == null || request.GoodsId <= 0)
{
return ApiResponse<PrizeContentResponseDto>.Fail("商品ID不能为空");
}
var result = await _prizeService.GetPrizeContentAsync(request.GoodsId, request.Num);
return ApiResponse<PrizeContentResponseDto>.Success(result);
}
catch (Exception ex)
{
_logger.LogError(ex, "Failed to get prize content: GoodsId={GoodsId}", request?.GoodsId);
return ApiResponse<PrizeContentResponseDto>.Fail("获取奖品内容失败");
}
}
/// <summary>
/// 获取中奖记录
/// POST /api/goods_prize_logs
/// Requirements: 8.1-8.4
/// </summary>
[HttpPost("goods_prize_logs")]
[Authorize]
public async Task<ApiResponse<PrizeLogsResponseDto>> GetPrizeLogs([FromBody] PrizeLogsRequest? request)
{
var userId = GetCurrentUserId();
if (userId == null)
{
return ApiResponse<PrizeLogsResponseDto>.Unauthorized();
}
try
{
if (request == null || request.GoodsId <= 0)
{
return ApiResponse<PrizeLogsResponseDto>.Fail("商品ID不能为空");
}
var page = request.Page < 1 ? 1 : request.Page;
var pageSize = request.PageSize < 1 ? 15 : request.PageSize;
var result = await _prizeService.GetPrizeLogsAsync(
request.GoodsId,
request.GoodsNum,
request.ShangId,
page,
pageSize);
return ApiResponse<PrizeLogsResponseDto>.Success(result);
}
catch (Exception ex)
{
_logger.LogError(ex, "Failed to get prize logs: GoodsId={GoodsId}", request?.GoodsId);
return ApiResponse<PrizeLogsResponseDto>.Fail("获取中奖记录失败");
}
}
#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
}