350 lines
11 KiB
C#
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
|
|
}
|