/***********************************************************************
* Project: CoreCms
* ProjectName: 核心内容管理系统
* Web: https://www.corecms.net
* Author: 大灰灰
* Email: jianweie@163.com
* CreateTime: 2025/9/2 17:54:05
* Description: 暂无
***********************************************************************/
using System;
using System.ComponentModel;
using System.IO;
using System.Linq;
using System.Linq.Expressions;
using System.Threading.Tasks;
using CoreCms.Net.Configuration;
using CoreCms.Net.Model.Entities;
using CoreCms.Net.Model.Entities.Expression;
using CoreCms.Net.Model.FromBody;
using CoreCms.Net.Model.ViewModels.UI;
using CoreCms.Net.Filter;
using CoreCms.Net.Loging;
using CoreCms.Net.IServices;
using CoreCms.Net.Utility.Helper;
using CoreCms.Net.Utility.Extensions;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc;
using NPOI.HSSF.UserModel;
using SqlSugar;
using CoreCms.Net.Web.Admin.Infrastructure;
using CoreCms.Net.Services;
using System.Collections.Generic;
using AutoMapper;
using CoreCms.Net.Model.ViewModels.SQ;
using CoreCms.Net.IRepository.UnitOfWork;
namespace CoreCms.Net.Web.Admin.Controllers
{
///
/// 预约表
///
[Description("预约表")]
[Route("api/[controller]/[action]")]
[ApiController]
[RequiredErrorForAdmin]
[Authorize]
public class SQReservationsController : 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 ISQEarningsServices _sQEarningsServices;
private readonly ISQMessageServices _sQMessageServices;
private readonly IUnitOfWork _unitOfWork;
///
/// 构造函数
///
public SQReservationsController(IWebHostEnvironment webHostEnvironment
, ISQReservationsServices SQReservationsServices
, ISQRoomsServices SQRoomsServices
, ISysDictionaryServices sysDictionaryServices
, ISysDictionaryDataServices sysDictionaryDataServices
, ISQReservationParticipantsServices sQReservationParticipantsServices
, IMapper mapper
, ICoreCmsUserServices userServices
, ISQEarningsServices sQEarningsServices
, ISQMessageServices sQMessageServices
, IUnitOfWork unitOfWork
)
{
_webHostEnvironment = webHostEnvironment;
_SQReservationsServices = SQReservationsServices;
_SQRoomsServices = SQRoomsServices;
_sysDictionaryServices = sysDictionaryServices;
_sysDictionaryDataServices = sysDictionaryDataServices;
_SQReservationParticipantsServices = sQReservationParticipantsServices;
_mapper = mapper;
_userServices = userServices;
_sQEarningsServices = sQEarningsServices;
_sQMessageServices = sQMessageServices;
_unitOfWork = unitOfWork;
}
#region 获取列表============================================================
// POST: Api/SQReservations/GetPageList
///
/// 获取列表
///
///
[HttpPost]
[Description("获取列表")]
public async Task GetPageList()
{
var jm = new AdminUiCallBack();
var pageCurrent = Request.Form["page"].FirstOrDefault().ObjectToInt(1);
var pageSize = Request.Form["limit"].FirstOrDefault().ObjectToInt(30);
var where = PredicateBuilder.True();
//获取排序字段
var orderField = Request.Form["orderField"].FirstOrDefault();
Expression> orderEx = orderField switch
{
"id" => p => p.id,
"title" => p => p.title,
"room_id" => p => p.room_id,
"room_name" => p => p.room_name,
"start_time" => p => p.start_time,
"end_time" => p => p.end_time,
"duration_minutes" => p => p.duration_minutes,
"player_count" => p => p.player_count,
"game_type" => p => p.game_type,
"game_rule" => p => p.game_rule,
"extra_info" => p => p.extra_info,
"is_smoking" => p => p.is_smoking,
"gender_limit" => p => p.gender_limit,
"credit_limit" => p => p.credit_limit,
"min_age" => p => p.min_age,
"max_age" => p => p.max_age,
"deposit_fee" => p => p.deposit_fee,
"status" => p => p.status,
"created_at" => p => p.created_at,
"updated_at" => p => p.updated_at,
_ => p => p.id
};
//设置排序方式
var orderDirection = Request.Form["orderDirection"].FirstOrDefault();
var orderBy = orderDirection switch
{
"asc" => OrderByType.Asc,
"desc" => OrderByType.Desc,
_ => OrderByType.Desc
};
//查询筛选
//预约ID int
var id = Request.Form["id"].FirstOrDefault().ObjectToInt(0);
if (id > 0)
{
where = where.And(p => p.id == id);
}
//组局名称 nvarchar
var title = Request.Form["title"].FirstOrDefault();
if (!string.IsNullOrEmpty(title))
{
where = where.And(p => p.title.Contains(title));
}
//房间ID int
var room_id = Request.Form["room_id"].FirstOrDefault().ObjectToInt(0);
if (room_id > 0)
{
where = where.And(p => p.room_id == room_id);
}
//房间名称(冗余存储,比如 304号-大包,30元/小时) nvarchar
var room_name = Request.Form["room_name"].FirstOrDefault();
if (!string.IsNullOrEmpty(room_name))
{
where = where.And(p => p.room_name.Contains(room_name));
}
//开始时间 datetime
var start_time = Request.Form["start_time"].FirstOrDefault();
if (!string.IsNullOrEmpty(start_time))
{
if (start_time.Contains("到"))
{
var dts = start_time.Split("到");
var dtStart = dts[0].Trim().ObjectToDate();
where = where.And(p => p.start_time > dtStart);
var dtEnd = dts[1].Trim().ObjectToDate();
where = where.And(p => p.start_time < dtEnd);
}
else
{
var dt = start_time.ObjectToDate();
where = where.And(p => p.start_time > dt);
}
}
//结束时间 datetime
var end_time = Request.Form["end_time"].FirstOrDefault();
if (!string.IsNullOrEmpty(end_time))
{
if (end_time.Contains("到"))
{
var dts = end_time.Split("到");
var dtStart = dts[0].Trim().ObjectToDate();
where = where.And(p => p.end_time > dtStart);
var dtEnd = dts[1].Trim().ObjectToDate();
where = where.And(p => p.end_time < dtEnd);
}
else
{
var dt = end_time.ObjectToDate();
where = where.And(p => p.end_time > dt);
}
}
//时长(分钟) int
var duration_minutes = Request.Form["duration_minutes"].FirstOrDefault().ObjectToInt(0);
if (duration_minutes > 0)
{
where = where.And(p => p.duration_minutes == duration_minutes);
}
//人数 int
var player_count = Request.Form["player_count"].FirstOrDefault().ObjectToInt(0);
if (player_count > 0)
{
where = where.And(p => p.player_count == player_count);
}
//玩法类型(如:补克) nvarchar
var game_type = Request.Form["game_type"].FirstOrDefault();
if (!string.IsNullOrEmpty(game_type))
{
where = where.And(p => p.game_type.Contains(game_type));
}
//具体规则(如:斗地主) nvarchar
var game_rule = Request.Form["game_rule"].FirstOrDefault();
if (!string.IsNullOrEmpty(game_rule))
{
where = where.And(p => p.game_rule.Contains(game_rule));
}
//其他补充 nvarchar
var extra_info = Request.Form["extra_info"].FirstOrDefault();
if (!string.IsNullOrEmpty(extra_info))
{
where = where.And(p => p.extra_info.Contains(extra_info));
}
//是否禁烟:0=不限制,1=禁烟,2=不禁烟 int
var is_smoking = Request.Form["is_smoking"].FirstOrDefault().ObjectToInt(0);
if (is_smoking > 0)
{
where = where.And(p => p.is_smoking == is_smoking);
}
//性别限制:0=不限,1=男,2=女 int
var gender_limit = Request.Form["gender_limit"].FirstOrDefault().ObjectToInt(0);
if (gender_limit > 0)
{
where = where.And(p => p.gender_limit == gender_limit);
}
//最低信誉分 decimal
var credit_limit = Request.Form["credit_limit"].FirstOrDefault().ObjectToDecimal(0);
if (credit_limit > 0)
{
where = where.And(p => p.credit_limit == credit_limit);
}
//最小年龄限制 int
var min_age = Request.Form["min_age"].FirstOrDefault().ObjectToInt(0);
if (min_age > 0)
{
where = where.And(p => p.min_age == min_age);
}
//最大年龄限制,0=不限 int
var max_age = Request.Form["max_age"].FirstOrDefault().ObjectToInt(0);
if (max_age > 0)
{
where = where.And(p => p.max_age == max_age);
}
//鸽子费(保证金) decimal
var deposit_fee = Request.Form["deposit_fee"].FirstOrDefault().ObjectToDecimal(0);
if (deposit_fee > 0)
{
where = where.And(p => p.deposit_fee == deposit_fee);
}
//状态:0=待开始,1=进行中,2=已结束,3=取消 int
var status = Request.Form["status"].FirstOrDefault().ObjectToInt(0);
if (status > 0)
{
where = where.And(p => p.status == status);
}
//创建时间 datetime
var created_at = Request.Form["created_at"].FirstOrDefault();
if (!string.IsNullOrEmpty(created_at))
{
if (created_at.Contains("到"))
{
var dts = created_at.Split("到");
var dtStart = dts[0].Trim().ObjectToDate();
where = where.And(p => p.created_at > dtStart);
var dtEnd = dts[1].Trim().ObjectToDate();
where = where.And(p => p.created_at < dtEnd);
}
else
{
var dt = created_at.ObjectToDate();
where = where.And(p => p.created_at > dt);
}
}
//更新时间 datetime
var updated_at = Request.Form["updated_at"].FirstOrDefault();
if (!string.IsNullOrEmpty(updated_at))
{
if (updated_at.Contains("到"))
{
var dts = updated_at.Split("到");
var dtStart = dts[0].Trim().ObjectToDate();
where = where.And(p => p.updated_at > dtStart);
var dtEnd = dts[1].Trim().ObjectToDate();
where = where.And(p => p.updated_at < dtEnd);
}
else
{
var dt = updated_at.ObjectToDate();
where = where.And(p => p.updated_at > dt);
}
}
//获取数据
var list = await _SQReservationsServices.QueryPageAsync(where, orderEx, orderBy, pageCurrent, pageSize, true);
var pageList = _mapper.Map>(list);
var rIds = list.Select(it => it.id).ToList();
if (rIds != null && rIds.Count > 0)
{
var participants = await _SQReservationParticipantsServices.QueryListByClauseAsync(it => rIds.Contains(it.reservation_id), "", true);
List userList = new List();
if (participants != null && participants.Count > 0)
{
var userIds = participants.Select(it => it.user_id).ToList();
userList = await _userServices.QueryListByClauseAsync(it => userIds.Contains(it.id), "", true);
}
foreach (var item in pageList)
{
var temp = participants.Where(it => it.reservation_id == item.id).OrderBy(it => it.role).ThenBy(it => it.status).ToList();
var dto = _mapper.Map>(temp);
if (userList != null && userList.Count > 0)
{
foreach (var p in dto)
{
var u = userList.FirstOrDefault(it => it.id == p.user_id);
if (u != null)
{
p.UserName = u.nickName;
p.AvatarImage = u.avatarImage;
}
}
}
item.Participants = dto;
}
}
//返回数据
jm.data = pageList;
jm.code = 0;
jm.count = list.TotalCount;
jm.msg = "数据调用成功!";
return jm;
}
#endregion
#region 首页数据============================================================
// POST: Api/SQReservations/GetIndex
///
/// 首页数据
///
///
[HttpPost]
[Description("首页数据")]
public AdminUiCallBack GetIndex()
{
var list = _SQRoomsServices.QueryListByClause(it => it.status);
var data = list.Select(it => new { it.name, it.id }).ToList();
var dic = _sysDictionaryServices.QueryListByClause(it => !it.deleted, it => it.sortNumber
, OrderByType.Asc);
var dicData = _sysDictionaryDataServices.QueryListByClause(it => !it.deleted);
var options = new List