using System; using System.Collections.Generic; using System.Threading.Tasks; using CoreCms.Net.Auth.HttpContextUser; 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 AsyncLock _mutex = new AsyncLock(); /// /// 构造函数 /// public CheckInController(IHttpContextUser user, ICoreCmsUserCheckInDetailsServices userCheckInDetailsServices) { _user = user; _userCheckInDetailsServices = userCheckInDetailsServices; } /// /// 用户签到 /// /// [HttpPost] [Authorize] public async Task DoUserCheckIn([FromBody] FMDoUserCheckIn entity) { using (await _mutex.LockAsync()) { var jm = new WebApiCallBack(); 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; } } /// /// 获取用户总签到次数 /// /// [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 = new List(); foreach (var item in list) { var stringStr = item.checkInData.ToString("yyyy-MM-dd"); stringArr.Add(stringStr); } jm.status = true; jm.data = stringArr; jm.msg = "获取成功"; return jm; } } }