using Microsoft.AspNetCore.Mvc; using QYZH.InteractiveMagazine.IService; using QYZH.InteractiveMagazine.Models.Common; using QYZH.InteractiveMagazine.Models.Dto; using QYZH.InteractiveMagazine.Models.Dto.UserAnswerTaskService; using System.ComponentModel.DataAnnotations; namespace QYZH.InteractiveMagazine.WebApi.Controllers.WeChat; /// /// 小程序首页控制器 /// public class UserAnswerTaskController : WeChatBaseController { private readonly IUserAnswerTaskService _userAnswerTaskService; private readonly ILogger _logger; /// /// 构造函数 /// public UserAnswerTaskController( IUserAnswerTaskService userAnswerTaskService, ILogger logger) { _userAnswerTaskService = userAnswerTaskService; _logger = logger; } /// /// 获取当前用户的期刊学习进度列表 /// /// 按期刊分组的学习进度数据 [HttpGet("progress")] public async Task>> GetProgressAsync() { try { var userId = GetCurrentUserId(); if (userId == 0) { return BaseResponse>.Fail(ResultCode.DENY, "未获取到用户信息"); } var result = await _userAnswerTaskService.GetJournalProgressAsync(userId); return Success(result); } catch (Exception ex) { _logger.LogError(ex, "获取学习进度失败,UserId: {UserId}", GetCurrentUserId()); return BaseResponse>.Fail("获取学习进度失败,请稍后重试"); } } /// /// 获取目录列表(按一级目录分组,二级目录含完成状态) /// /// 期刊Id /// 按一级目录分组的目录列表 [HttpGet("catalog-list/{journalId:long}")] public async Task>> GetCatalogListAsync([Required] long journalId) { try { var userId = GetCurrentUserId(); if (userId == 0) { return BaseResponse>.Fail(ResultCode.DENY, "未获取到用户信息"); } if (journalId <= 0) { return BaseResponse>.Fail(ResultCode.PARAM_ERROR, "期刊Id不能为空"); } var result = await _userAnswerTaskService.GetCatalogListAsync(journalId, userId); return Success(result); } catch (Exception ex) { _logger.LogError(ex, "获取目录列表失败,JournalId: {JournalId}, UserId: {UserId}", journalId, GetCurrentUserId()); return BaseResponse>.Fail("获取目录列表失败,请稍后重试"); } } /// /// 获取一级目录概览(含二级目录详情、页码范围、任务完成状态) /// /// 一级目录Id /// 一级目录概览数据 [HttpGet("catalog-overview/{catalogId:long}")] public async Task> GetCatalogOverviewAsync([Required] long catalogId) { try { var userId = GetCurrentUserId(); if (userId == 0) { return BaseResponse.Fail(ResultCode.DENY, "未获取到用户信息"); } if (catalogId <= 0) { return BaseResponse.Fail(ResultCode.PARAM_ERROR, "目录Id不能为空"); } var result = await _userAnswerTaskService.GetCatalogOverviewAsync(catalogId, userId); if (result == null) { return BaseResponse.Fail("未找到该目录"); } return Success(result); } catch (Exception ex) { _logger.LogError(ex, "获取目录概览失败,CatalogId: {CatalogId}, UserId: {UserId}", catalogId, GetCurrentUserId()); return BaseResponse.Fail("获取目录概览失败,请稍后重试"); } } /// /// 获取用户答题任务列表 /// /// 二级目录Id /// 答题任务列表 [HttpGet("task-list/{catalogId:long}")] public async Task> GetTaskListAsync([Required] long catalogId) { try { var userId = GetCurrentUserId(); if (userId == 0) { return BaseResponse.Fail(ResultCode.DENY, "未获取到用户信息"); } if (catalogId <= 0) { return BaseResponse.Fail(ResultCode.PARAM_ERROR, "目录Id不能为空"); } var result = await _userAnswerTaskService.GetUserAnswerTaskListAsync(catalogId, userId); if (result == null) { return BaseResponse.Fail("未找到该目录"); } return Success(result); } catch (Exception ex) { _logger.LogError(ex, "获取任务列表失败,CatalogId: {CatalogId}, UserId: {UserId}", catalogId, GetCurrentUserId()); return BaseResponse.Fail("获取任务列表失败,请稍后重试"); } } /// /// 获取跨页题目详情 /// /// 任务Id /// 跨页题目详情 [HttpGet("cross-page-task/{journalPageTaskId:long}")] public async Task> GetCrossPageTaskAsync([Required] long journalPageTaskId) { try { var userId = GetCurrentUserId(); if (userId == 0) { return BaseResponse.Fail(ResultCode.DENY, "未获取到用户信息"); } if (journalPageTaskId <= 0) { return BaseResponse.Fail(ResultCode.PARAM_ERROR, "任务Id不能为空"); } var result = await _userAnswerTaskService.GetCrossPageTaskAsync(journalPageTaskId, userId); if (result == null) { return BaseResponse.Fail("未找到该任务"); } return Success(result); } catch (Exception ex) { _logger.LogError(ex, "获取跨页题目失败,JournalPageTaskId: {JournalPageTaskId}, UserId: {UserId}", journalPageTaskId, GetCurrentUserId()); return BaseResponse.Fail("获取跨页题目失败,请稍后重试"); } } /// /// 领取任务积分 /// /// 任务Id /// 领取结果 [HttpPost("claim-points/{journalPageTaskId:long}")] public async Task> ClaimTaskPointsAsync([Required] long journalPageTaskId) { try { var userId = GetCurrentUserId(); if (userId == 0) { return BaseResponse.Fail(ResultCode.DENY, "未获取到用户信息"); } if (journalPageTaskId <= 0) { return BaseResponse.Fail(ResultCode.PARAM_ERROR, "任务Id不能为空"); } var result = await _userAnswerTaskService.ClaimTaskPointsAsync(journalPageTaskId, userId); return Success(result); } catch (BusinessException ex) { _logger.LogWarning(ex, "领取任务积分业务异常,JournalPageTaskId: {JournalPageTaskId}, UserId: {UserId}", journalPageTaskId, GetCurrentUserId()); return BaseResponse.Fail(ex.Message); } catch (Exception ex) { _logger.LogError(ex, "领取任务积分失败,JournalPageTaskId: {JournalPageTaskId}, UserId: {UserId}", journalPageTaskId, GetCurrentUserId()); return BaseResponse.Fail("领取任务积分失败,请稍后重试"); } } /// /// 批量领取任务积分(一键领取) /// /// 批量领取参数 /// 批量领取结果 [HttpPost("batch-claim-points")] public async Task> BatchClaimPointsAsync([FromBody] BatchClaimPointsInput input) { try { var userId = GetCurrentUserId(); if (userId == 0) { return BaseResponse.Fail(ResultCode.DENY, "未获取到用户信息"); } if (input == null || input.GroupIds == null || input.GroupIds.Count == 0) { return BaseResponse.Fail(ResultCode.PARAM_ERROR, "任务分组Id列表不能为空"); } var result = await _userAnswerTaskService.BatchClaimPointsAsync(input, userId); return Success(result); } catch (BusinessException ex) { _logger.LogWarning(ex, "批量领取积分业务异常,UserId: {UserId}", GetCurrentUserId()); return BaseResponse.Fail(ex.Message); } catch (Exception ex) { _logger.LogError(ex, "批量领取积分失败,UserId: {UserId}", GetCurrentUserId()); return BaseResponse.Fail("批量领取积分失败,请稍后重试"); } } /// /// 获取杂志列表 /// /// 查询类型:Bound=已绑定,Unbound=未绑定(添加书籍用),默认是:Bound /// 杂志列表 [HttpGet("journal-list")] public async Task>> GetJournalListAsync([FromQuery] string? queryType = "Bound") { try { var userId = GetCurrentUserId(); if (userId == 0) { return BaseResponse>.Fail(ResultCode.DENY, "未获取到用户信息"); } var result = await _userAnswerTaskService.GetJournalListAsync(userId, queryType); return Success(result); } catch (BusinessException ex) { _logger.LogWarning(ex, "查询杂志列表业务异常,UserId: {UserId}", GetCurrentUserId()); return BaseResponse>.Fail(ex.Message); } catch (Exception ex) { _logger.LogError(ex, "查询杂志列表失败,UserId: {UserId}", GetCurrentUserId()); return BaseResponse>.Fail("查询杂志列表失败,请稍后重试"); } } /// /// 新增学生 /// /// 新增学生参数 /// 新增学生结果 [HttpPost("add-student")] public async Task> AddStudentAsync([FromBody] AddStudentInput input) { try { var userId = GetCurrentUserId(); if (userId == 0) { return BaseResponse.Fail(ResultCode.DENY, "未获取到用户信息"); } var result = await _userAnswerTaskService.AddStudentAsync(input, userId); return Success(result); } catch (BusinessException ex) { _logger.LogWarning(ex, "新增学生业务异常,UserId: {UserId}", GetCurrentUserId()); return BaseResponse.Fail(ex.Message); } catch (Exception ex) { _logger.LogError(ex, "新增学生失败,UserId: {UserId}", GetCurrentUserId()); return BaseResponse.Fail("新增学生失败,请稍后重试"); } } }