using System.Security.Claims; using HoneyBox.Core.Interfaces; using HoneyBox.Model.Base; using HoneyBox.Model.Models; using HoneyBox.Model.Models.Order; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; namespace HoneyBox.Api.Controllers; /// /// 仓库控制器 - 处理用户仓库和发货功能 /// /// /// 提供仓库查询、奖品回收、发货申请、物流查询等功能 /// [ApiController] [Route("api")] public class WarehouseController : ControllerBase { private readonly IWarehouseService _warehouseService; private readonly ILogger _logger; public WarehouseController( IWarehouseService warehouseService, ILogger logger) { _warehouseService = warehouseService; _logger = logger; } #region 仓库查询 /// /// 仓库首页查询 /// /// /// GET /api/warehouse_index /// /// 获取用户仓库中的奖品列表 /// Requirements: 10.1-10.3 /// /// 页码 /// 类型: 1赏品 2预售 3卡册 4保险柜 5无限赏 /// 搜索关键词 /// 仓库奖品列表 [HttpGet("warehouse_index")] [Authorize] [ProducesResponseType(typeof(ApiResponse), StatusCodes.Status200OK)] [ProducesResponseType(typeof(ApiResponse), StatusCodes.Status401Unauthorized)] public async Task> GetWarehouseIndex( [FromQuery] int page = 1, [FromQuery] int type = 1, [FromQuery] string? keyword = null) { var userId = GetCurrentUserId(); if (userId == null) { return ApiResponse.Unauthorized(); } try { var request = new WarehouseIndexRequest { Page = page < 1 ? 1 : page, Type = type, Keyword = keyword, PageSize = 10 }; var result = await _warehouseService.GetWarehouseIndexAsync(userId.Value, request); return ApiResponse.Success(result); } catch (Exception ex) { _logger.LogError(ex, "Failed to get warehouse index: UserId={UserId}", userId); return ApiResponse.Fail("获取仓库列表失败"); } } #endregion #region 奖品回收 /// /// 奖品回收 /// POST /api/warehouse_recovery /// Requirements: 11.1-11.5 /// [HttpPost("warehouse_recovery")] [Authorize] public async Task> RecoveryPrizes([FromBody] RecoveryRequest? request) { var userId = GetCurrentUserId(); if (userId == null) { return ApiResponse.Unauthorized(); } try { if (request == null || string.IsNullOrWhiteSpace(request.RecoveryInfo)) { return ApiResponse.Fail("请选择要回收的奖品"); } var result = await _warehouseService.RecoveryPrizesAsync(userId.Value, request); return ApiResponse.Success(result); } catch (InvalidOperationException ex) { _logger.LogWarning("Recovery prizes failed: UserId={UserId}, Error={Error}", userId, ex.Message); return ApiResponse.Fail(ex.Message); } catch (Exception ex) { _logger.LogError(ex, "Failed to recovery prizes: UserId={UserId}", userId); return ApiResponse.Fail("回收奖品失败"); } } #endregion #region 奖品发货 /// /// 奖品发货申请 /// /// /// POST /api/warehouse_send /// /// 申请将仓库中的奖品发货到指定地址 /// Requirements: 12.1-12.5 /// /// 发货申请请求参数 /// 发货申请结果 [HttpPost("warehouse_send")] [Authorize] [ProducesResponseType(typeof(ApiResponse), StatusCodes.Status200OK)] [ProducesResponseType(typeof(ApiResponse), StatusCodes.Status401Unauthorized)] public async Task> SendPrizes([FromBody] SendRequest? request) { var userId = GetCurrentUserId(); if (userId == null) { return ApiResponse.Unauthorized(); } try { if (request == null || string.IsNullOrWhiteSpace(request.RecoveryInfo)) { return ApiResponse.Fail("请选择要发货的奖品"); } if (string.IsNullOrWhiteSpace(request.Name)) { return ApiResponse.Fail("请填写收货人姓名"); } if (string.IsNullOrWhiteSpace(request.Mobile)) { return ApiResponse.Fail("请填写收货人手机号"); } if (string.IsNullOrWhiteSpace(request.Address)) { return ApiResponse.Fail("请填写收货地址"); } var result = await _warehouseService.SendPrizesAsync(userId.Value, request); return ApiResponse.Success(result); } catch (InvalidOperationException ex) { _logger.LogWarning("Send prizes failed: UserId={UserId}, Error={Error}", userId, ex.Message); return ApiResponse.Fail(ex.Message); } catch (Exception ex) { _logger.LogError(ex, "Failed to send prizes: UserId={UserId}", userId); return ApiResponse.Fail("发货申请失败"); } } /// /// 确认发货 /// POST /api/warehouse_send_confirm /// Requirements: 13.1-13.2 /// [HttpPost("warehouse_send_confirm")] [Authorize] public async Task ConfirmSend([FromBody] ConfirmSendRequest? request) { var userId = GetCurrentUserId(); if (userId == null) { return ApiResponse.Unauthorized(); } try { if (request == null || request.Id <= 0) { return ApiResponse.Fail("发货记录ID不能为空"); } var result = await _warehouseService.ConfirmSendAsync(userId.Value, request.Id); if (result) { return ApiResponse.Success("确认成功"); } return ApiResponse.Fail("确认失败"); } catch (InvalidOperationException ex) { _logger.LogWarning("Confirm send failed: UserId={UserId}, Id={Id}, Error={Error}", userId, request?.Id, ex.Message); return ApiResponse.Fail(ex.Message); } catch (Exception ex) { _logger.LogError(ex, "Failed to confirm send: UserId={UserId}, Id={Id}", userId, request?.Id); return ApiResponse.Fail("确认发货失败"); } } #endregion #region 记录查询 /// /// 发货记录查询 /// POST /api/warehouse_send_record /// Requirements: 14.1-14.3 /// [HttpPost("warehouse_send_record")] [Authorize] public async Task>> GetSendRecords([FromBody] SendRecordRequest? request) { var userId = GetCurrentUserId(); if (userId == null) { return ApiResponse>.Unauthorized(); } try { request ??= new SendRecordRequest(); if (request.Page < 1) request.Page = 1; if (request.Status < 1) request.Status = 1; var result = await _warehouseService.GetSendRecordsAsync(userId.Value, request.Page, request.Status); return ApiResponse>.Success(result); } catch (Exception ex) { _logger.LogError(ex, "Failed to get send records: UserId={UserId}", userId); return ApiResponse>.Fail("获取发货记录失败"); } } /// /// 发货记录详情查询 /// POST /api/warehouse_send_record_detail /// Requirements: 15.1-15.3 /// [HttpPost("warehouse_send_record_detail")] [Authorize] public async Task> GetSendRecordDetail([FromBody] SendRecordDetailRequest? request) { var userId = GetCurrentUserId(); if (userId == null) { return ApiResponse.Unauthorized(); } try { if (request == null || request.Id <= 0) { return ApiResponse.Fail("发货记录ID不能为空"); } var result = await _warehouseService.GetSendRecordDetailAsync(userId.Value, request.Id); return ApiResponse.Success(result); } catch (InvalidOperationException ex) { _logger.LogWarning("Get send record detail failed: UserId={UserId}, Id={Id}, Error={Error}", userId, request?.Id, ex.Message); return ApiResponse.Fail(ex.Message); } catch (Exception ex) { _logger.LogError(ex, "Failed to get send record detail: UserId={UserId}, Id={Id}", userId, request?.Id); return ApiResponse.Fail("获取发货记录详情失败"); } } /// /// 回收记录查询 /// POST /api/warehouse_recovery_record /// Requirements: 16.1-16.2 /// [HttpPost("warehouse_recovery_record")] [Authorize] public async Task>> GetRecoveryRecords([FromBody] RecoveryRecordRequest? request) { var userId = GetCurrentUserId(); if (userId == null) { return ApiResponse>.Unauthorized(); } try { request ??= new RecoveryRecordRequest(); if (request.Page < 1) request.Page = 1; var result = await _warehouseService.GetRecoveryRecordsAsync(userId.Value, request.Page); return ApiResponse>.Success(result); } catch (Exception ex) { _logger.LogError(ex, "Failed to get recovery records: UserId={UserId}", userId); return ApiResponse>.Fail("获取回收记录失败"); } } #endregion #region 物流查询 /// /// 物流信息查询 /// POST /api/warehouse_order_logistics /// Requirements: 17.1-17.3 /// [HttpPost("warehouse_order_logistics")] [Authorize] public async Task> GetLogistics([FromBody] LogisticsRequest? request) { var userId = GetCurrentUserId(); if (userId == null) { return ApiResponse.Unauthorized(); } try { if (request == null || request.Id <= 0) { return ApiResponse.Fail("发货记录ID不能为空"); } var result = await _warehouseService.GetLogisticsAsync(userId.Value, request.Id); return ApiResponse.Success(result); } catch (InvalidOperationException ex) { _logger.LogWarning("Get logistics failed: UserId={UserId}, Id={Id}, Error={Error}", userId, request?.Id, ex.Message); return ApiResponse.Fail(ex.Message); } catch (Exception ex) { _logger.LogError(ex, "Failed to get logistics: UserId={UserId}, Id={Id}", userId, request?.Id); return ApiResponse.Fail("获取物流信息失败"); } } #endregion #region 保险柜操作 /// /// 移入保险柜 /// /// /// POST /api/warehouse_movein /// /// 将仓库中的奖品移入保险柜 /// Requirements: 12.1 /// /// 移入请求参数 /// 操作结果 [HttpPost("warehouse_movein")] [Authorize] [ProducesResponseType(typeof(ApiResponse), StatusCodes.Status200OK)] [ProducesResponseType(typeof(ApiResponse), StatusCodes.Status401Unauthorized)] public async Task MoveIntoSafe([FromBody] SafeOperationRequest? request) { var userId = GetCurrentUserId(); if (userId == null) { return ApiResponse.Unauthorized(); } try { if (request == null || string.IsNullOrWhiteSpace(request.RecoveryInfo)) { return ApiResponse.Fail("请选择兑换的赏品"); } var result = await _warehouseService.MoveIntoSafeAsync(userId.Value, request); if (result) { return ApiResponse.Success("移入成功"); } return ApiResponse.Fail("移入失败"); } catch (InvalidOperationException ex) { _logger.LogWarning("Move into safe failed: UserId={UserId}, Error={Error}", userId, ex.Message); return ApiResponse.Fail(ex.Message); } catch (Exception ex) { _logger.LogError(ex, "Failed to move into safe: UserId={UserId}", userId); return ApiResponse.Fail("移入失败"); } } /// /// 移出保险柜 /// /// /// POST /api/warehouse_remove /// /// 将保险柜中的奖品移出到仓库 /// Requirements: 12.2 /// /// 移出请求参数 /// 操作结果 [HttpPost("warehouse_remove")] [Authorize] [ProducesResponseType(typeof(ApiResponse), StatusCodes.Status200OK)] [ProducesResponseType(typeof(ApiResponse), StatusCodes.Status401Unauthorized)] public async Task RemoveFromSafe([FromBody] SafeOperationRequest? request) { var userId = GetCurrentUserId(); if (userId == null) { return ApiResponse.Unauthorized(); } try { if (request == null || string.IsNullOrWhiteSpace(request.RecoveryInfo)) { return ApiResponse.Fail("请选择兑换的赏品"); } var result = await _warehouseService.RemoveFromSafeAsync(userId.Value, request); if (result) { return ApiResponse.Success("移出成功"); } return ApiResponse.Fail("移出失败"); } catch (InvalidOperationException ex) { _logger.LogWarning("Remove from safe failed: UserId={UserId}, Error={Error}", userId, ex.Message); return ApiResponse.Fail(ex.Message); } catch (Exception ex) { _logger.LogError(ex, "Failed to remove from safe: UserId={UserId}", userId); return ApiResponse.Fail("移出失败"); } } #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 }