using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using CoreCms.Net.Auth.HttpContextUser; using CoreCms.Net.Caching.AutoMate.RedisCache; using CoreCms.Net.Configuration; using CoreCms.Net.IRepository; using CoreCms.Net.IServices; using CoreCms.Net.Model.Entities; using CoreCms.Net.Model.FromBody; using CoreCms.Net.Model.ViewModels.UI; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Nito.AsyncEx; namespace CoreCms.Net.Web.WebApi.Controllers { /// /// 签到控制器 /// [Route("api/[controller]/[action]")] [ApiController] public class CheckInController : ControllerBase { private readonly ICoreCmsUserCheckInDetailsServices _userCheckInDetailsServices; private readonly IHttpContextUser _user; private readonly IRedisOperationRepository _redisOperationRepository; /// /// 构造函数 /// public CheckInController(IHttpContextUser user, ICoreCmsUserCheckInDetailsServices userCheckInDetailsServices, IRedisOperationRepository redisOperationRepository) { _user = user; _userCheckInDetailsServices = userCheckInDetailsServices; _redisOperationRepository = redisOperationRepository; } /// /// 用户签到 /// /// [HttpPost] [Authorize] public async Task DoUserCheckIn([FromBody] FMDoUserCheckIn entity) { var jm = new WebApiCallBack(); var lockKey = "LOCK_DoUserCheckIn:user_" + _user.ID; var lockHolder = Guid.NewGuid().ToString("N"); //锁持有者 var redisUserLock = await _redisOperationRepository.LockTakeAsync(lockKey, lockHolder, TimeSpan.FromSeconds(5)); if (redisUserLock) { try { var isHave = await _userCheckInDetailsServices.ExistsAsync(p => p.userId == _user.ID && p.checkInData == entity.date); if (isHave) { jm.msg = "今日您已签到"; return jm; } var detail = new CoreCmsUserCheckInDetails { userId = _user.ID, checkInData = entity.date, createTime = DateTime.Now }; var callBack = await _userCheckInDetailsServices.DoCheckIn(detail); jm.status = callBack.code == 0; jm.msg = callBack.msg; jm.data = callBack.data; return jm; } catch (Exception e) { jm.msg = "数据处理异常"; jm.otherData = e; } finally { await _redisOperationRepository.LockReleaseAsync(lockKey, lockHolder); } } else { jm.msg = "当前请求太频繁_请稍后再试"; } return jm; } /// /// 获取用户总签到次数 /// /// [HttpPost] [Authorize] public async Task GetUserCheckCount() { var jm = new WebApiCallBack { status = true, data = await _userCheckInDetailsServices.GetCountAsync(p => p.userId == _user.ID), msg = "获取成功" }; return jm; } /// /// 获取用户按月签到数据 /// /// [HttpPost] [Authorize] public async Task GetUserCheckByMonth([FromBody] FMGetUserCheckInByMonth entity) { var jm = new WebApiCallBack(); var dt = new DateTime(entity.year, entity.month, 1); var min = dt.AddDays(-1); var max = dt.AddMonths(1); var list = await _userCheckInDetailsServices.QueryListByClauseAsync(p => p.userId == _user.ID && p.checkInData > min && p.checkInData < max); var stringArr = list.Select(item => item.checkInData.ToString("yyyy-MM-dd")).ToList(); jm.status = true; jm.data = stringArr; jm.msg = "获取成功"; return jm; } } }