using AutoMapper; using CoreCms.Net.Auth.HttpContextUser; using CoreCms.Net.IRepository.UnitOfWork; using CoreCms.Net.IServices; using CoreCms.Net.Model.Entities; using CoreCms.Net.Model.Entities.Expression; using CoreCms.Net.Model.ViewModels.Basics; using CoreCms.Net.Model.ViewModels.SQ; using CoreCms.Net.Model.ViewModels.UI; using CoreCms.Net.Services; using CoreCms.Net.Services.SQ; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using NPOI.SS.Formula.Functions; using SqlSugar; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using CoreCms.Net.Services.SQ; using CoreCms.Net.Utility.Extensions; using ToolGood.Words.internals; namespace CoreCms.Net.Web.WebApi.Controllers; /// /// 预约接口 /// [Route("api/[controller]/[action]")] [ApiController] public class SQController : ControllerBase { private readonly IWebHostEnvironment _webHostEnvironment; private readonly ISQReservationsServices _SQReservationsServices; private readonly ISQRoomsServices _SQRoomsServices; private readonly ISysDictionaryDataServices _sysDictionaryDataServices; private readonly ISysDictionaryServices _sysDictionaryServices; private readonly ISQReservationParticipantsServices _SQReservationParticipantsServices; private readonly IMapper _mapper; private readonly ICoreCmsUserServices _userServices; private readonly IHttpContextUser _user; private readonly SqlSugarScope _dbBase; private readonly ICoreCmsUserBlacklistServices _coreCmsUserBlacklistServices; private readonly ISQReservationReputationServices _sQReservationReputationServices; private readonly ISQReservationEvaluateServices _sQReservationEvaluateServices; /// /// 构造函数 /// public SQController(IWebHostEnvironment webHostEnvironment , ISQReservationsServices SQReservationsServices , ISQRoomsServices SQRoomsServices , ISysDictionaryServices sysDictionaryServices , ISysDictionaryDataServices sysDictionaryDataServices , ISQReservationParticipantsServices sQReservationParticipantsServices , IMapper mapper , ICoreCmsUserServices userServices , IHttpContextUser user , IUnitOfWork unitOfWork , ICoreCmsUserBlacklistServices coreCmsUserBlacklistServices , ISQReservationEvaluateServices sQReservationEvaluateServices , ISQReservationReputationServices sQReservationReputationServices ) { _webHostEnvironment = webHostEnvironment; _SQReservationsServices = SQReservationsServices; _SQRoomsServices = SQRoomsServices; _sysDictionaryServices = sysDictionaryServices; _sysDictionaryDataServices = sysDictionaryDataServices; _SQReservationParticipantsServices = sQReservationParticipantsServices; _mapper = mapper; _userServices = userServices; _user = user; _dbBase = unitOfWork.GetDbClient(); _coreCmsUserBlacklistServices = coreCmsUserBlacklistServices; _sQReservationEvaluateServices = sQReservationEvaluateServices; _sQReservationReputationServices = sQReservationReputationServices; } /// /// 我的预约记录 /// /// 0 参与者,1发起者 /// 起始页 /// 页大小 /// [HttpGet] [Authorize] public async Task GetMyReservation([FromQuery] int type = 0, [FromQuery] int index = 1, [FromQuery] int size = 10) { var userId = _user.ID; var list = await _dbBase.Ado.SqlQueryAsync($"select r.*,p.id pid, p.status pstatus,p.join_time, p.quit_time ,p.is_refund from SQReservationParticipants p inner join SQReservations r on p.reservation_id=r.id where p.user_id={userId} and p.role={type} order by p.id desc OFFSET {(index - 1) * size} ROWS FETCH NEXT {size} ROWS ONLY"); if (list != null && list.Count > 0) { var roomList = await _SQRoomsServices.GetRoomList(); // 转为基类列表 var baseList = list.Cast().ToList(); await baseList.LoadSQReservationParticipantsApiDto(userId, _dbBase, _coreCmsUserBlacklistServices, roomList, _mapper); } return new WebApiDto() { Data = list, Code = 0, }; } /// /// 获取正在进行的预约 /// /// [HttpGet] [Authorize] public async Task GetMyUseReservation() { var userId = _user.ID; var list = await _dbBase.Ado.SqlQueryAsync($"select top 3 r.* from SQReservations r left join SQReservationParticipants p on r.id=p.reservation_id where r.status<2 and p.user_id={userId} and p.status=0 order by r.start_time "); if (list != null && list.Count > 0) { var roomList = await _SQRoomsServices.GetRoomList(); // 转为基类列表 var baseList = list.Cast().ToList(); await baseList.LoadSQReservationParticipantsApiDto(userId, _dbBase, _coreCmsUserBlacklistServices, roomList, _mapper); } return new WebApiDto() { Data = list, Code = 0, }; } /// /// 首页预约列表 /// /// /// /// [HttpGet] public async Task GetReservationList([FromQuery] int pageIndex = 1, [FromQuery] int pageSize = 20) { var userId = _user.ID; var now = DateTime.Now; var roomList = await _SQRoomsServices.GetRoomList(); var where = PredicateBuilder.True(); where = where.And(it => it.end_time > now); where = where.And(it => it.status < 2); var list = await _SQReservationsServices.QueryPageAsync(where, it => it.start_time, OrderByType.Asc, pageIndex, pageSize, true); var pageList = _mapper.Map>(list); if (pageList != null && pageList.Count > 0) { // 转为基类列表 var baseList = pageList.Cast().ToList(); await baseList.LoadSQReservationParticipantsApiDto(userId, _dbBase, _coreCmsUserBlacklistServices, roomList, _mapper); } return new WebApiDto() { Data = pageList, Code = 0, Msg = "ok", }; } /// /// 获取预约评价 /// /// /// [HttpGet] [Authorize] public async Task GetEvaluateServices([FromQuery] int reId) { var userId = _user.ID; var list = await _sQReservationEvaluateServices.QueryListByClauseAsync(it => it.reservation_id == reId && it.user_id == userId); var participants = await _dbBase.Ado.SqlQueryAsync($"select p.id,p.reservation_id,p.status,p.join_time,p.user_id, p.role,u.nickName UserName,u.avatarImage AvatarImage,ISNULL(u.play_level,4) play_level,ISNULL(u.skills_level,4) skills_level from SQReservationParticipants p inner join CoreCmsUser u on p.user_id=u.id where p.status=0 and p.reservation_id ={reId} and p.is_arrive=1 "); if (participants == null || participants.Count == 0) { return new WebApiDto() { Code = 0, Data = null }; } var userBlack = await _coreCmsUserBlacklistServices.GetUserBlacklists(userId); List obj = new List(); foreach (var item in participants) { if (item.user_id == userId) { continue; } var is_evaluate = false; decimal play_level = 0; decimal skills_level = 0; decimal user_play_level = 4; decimal user_skills_level = 4; DateTime? now = null; var userBlackStatus = false; if (list.Count > 0) { var e = list.Find(it => it.to_user_id == item.user_id); if (e != null) { is_evaluate = true; play_level = e.play_level; skills_level = e.skills_level; now = e.created_at; user_play_level = e.play_level; user_skills_level = e.skills_level; } } if (userBlack.Count > 0) { if (userBlack.Any(it => it == item.user_id)) { userBlackStatus = true; } } var o = new { item.UserName, item.user_id, item.AvatarImage, userBlackStatus, user_play_level, user_skills_level, is_evaluate, play_level, skills_level, evaluate_at = now }; obj.Add(o); } return new WebApiDto() { Code = 0, Data = obj }; } /// /// 评价用户 /// /// /// [HttpPost] [Authorize] public async Task AddEvaluateServices([FromBody] SQReservationEvaluateDto evaluate) { var userId = _user.ID; var reId = evaluate.reservation_id; var list = await _sQReservationEvaluateServices.QueryListByClauseAsync(it => it.reservation_id == reId && it.user_id == userId); var participants = await _dbBase.Ado.SqlQueryAsync($"select p.id,p.reservation_id,p.status,p.join_time,p.user_id, p.role,u.nickName UserName,u.avatarImage AvatarImage,ISNULL(u.play_level,4) play_level,ISNULL(u.skills_level,4) skills_level from SQReservationParticipants p inner join CoreCmsUser u on p.user_id=u.id where p.status=0 and p.reservation_id ={reId} and p.is_arrive=1 "); if (participants == null) { return new WebApiDto() { Code = 0, Data = null }; } List obj = new List(); var p = participants.Find(it => it.user_id == evaluate.to_user_id); if (p == null) { return new WebApiDto() { Code = 500, Data = null, Msg = "未找到对局记录" }; } SQReservationEvaluate sQReservationEvaluate = new SQReservationEvaluate() { created_at = DateTime.Now, play_level = evaluate.play_level, reservation_id = evaluate.reservation_id, role = p.role, skills_level = evaluate.skills_level, to_user_id = evaluate.to_user_id, user_id = userId, }; await _sQReservationEvaluateServices.InsertAsync(sQReservationEvaluate); var play_level = _dbBase.Ado.SqlQuerySingle($"select ISNULL(sum(play_level),0) level,count(1) rs_count from SQReservationEvaluate where to_user_id={evaluate.to_user_id} "); var skills_level = _dbBase.Ado.SqlQuerySingle($"select ISNULL(sum(skills_level),0) level,count(1) rs_count from SQReservationEvaluate where to_user_id={evaluate.to_user_id} "); //先加4 play_level.level += 4; if (play_level.rs_count > 0) { if (play_level.rs_count == 1) { play_level.rs_count++; } play_level.level = play_level.level / play_level.rs_count; } //先加4 skills_level.level += 4; if (skills_level.rs_count > 0) { if (skills_level.rs_count == 1) { skills_level.rs_count++; } skills_level.level = skills_level.level / skills_level.rs_count; } if (play_level.rs_count > 0 || skills_level.rs_count > 0) { await _userServices.UpdateAsync(it => new CoreCmsUser { play_level = play_level.level, skills_level = skills_level.level }, it => it.id == evaluate.to_user_id); } return new WebApiDto() { Code = 0, Data = null, Msg = "评价成功" }; } /// /// 获取我的声誉记录 /// /// /// /// [HttpGet] [Authorize] public async Task GetReputationByUser([FromQuery] int pageIndex = 1, [FromQuery] int pageSize = 20) { var list = await _sQReservationReputationServices.QueryPageAsync(it => it.user_id == _user.ID, it => it.created_at, OrderByType.Desc, pageIndex, pageSize, true); return new WebApiDto() { Code = 0, Data = list, Msg = "ok", }; } }