/*********************************************************************** * Project: CoreCms * ProjectName: 核心内容管理系统 * Web: https://www.corecms.net * Author: 大灰灰 * Email: jianweie@163.com * CreateTime: 2025/12/7 * Description: 收益管理 ***********************************************************************/ using CoreCms.Net.Configuration; using CoreCms.Net.Filter; using CoreCms.Net.IServices; 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.Utility.Extensions; using CoreCms.Net.Web.Admin.Infrastructure; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Mvc; using SqlSugar; using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Linq.Expressions; using System.Threading.Tasks; namespace CoreCms.Net.Web.Admin.Controllers { /// /// 收益管理 /// [Description("收益管理")] [Route("api/[controller]/[action]")] [ApiController] //[RequiredErrorForAdmin] [Authorize] public class SQEarningsController : ControllerBase { private readonly IWebHostEnvironment _webHostEnvironment; private readonly ISQEarningsServices _sQEarningsServices; private readonly ICoreCmsUserServices _userServices; private readonly ISQRoomsServices _sQRoomsServices; private readonly ISQReservationsServices _sQReservationsServices; /// /// 构造函数 /// public SQEarningsController( IWebHostEnvironment webHostEnvironment, ISQEarningsServices sQEarningsServices, ICoreCmsUserServices userServices, ISQRoomsServices sQRoomsServices, ISQReservationsServices sQReservationsServices) { _webHostEnvironment = webHostEnvironment; _sQEarningsServices = sQEarningsServices; _userServices = userServices; _sQRoomsServices = sQRoomsServices; _sQReservationsServices = sQReservationsServices; } #region 获取列表 /// /// 获取收益记录列表 /// /// [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, "user_id" => p => p.user_id, "earnings" => p => p.earnings, "type" => p => p.type, "create_time" => p => p.create_time, _ => p => p.id }; // 设置排序方式 var orderDirection = Request.Form["orderDirection"].FirstOrDefault(); var orderBy = orderDirection switch { "asc" => OrderByType.Asc, "desc" => OrderByType.Desc, _ => OrderByType.Desc }; // 查询筛选 var id = Request.Form["id"].FirstOrDefault().ObjectToInt(0); if (id > 0) { where = where.And(p => p.id == id); } var userId = Request.Form["user_id"].FirstOrDefault().ObjectToInt(0); if (userId > 0) { where = where.And(p => p.user_id == userId); } var type = Request.Form["type"].FirstOrDefault(); if (!string.IsNullOrEmpty(type)) { var typeInt = type.ObjectToInt(-1); if (typeInt >= 0) { where = where.And(p => p.type == typeInt); } } // 获取数据 var list = await _sQEarningsServices.QueryPageAsync(where, orderEx, orderBy, pageCurrent, pageSize, true); // 关联查询用户昵称 var userIds = list.Select(p => p.user_id).Distinct().ToList(); var userDict = new Dictionary(); if (userIds.Any()) { var users = await _userServices.QueryListByClauseAsync(p => userIds.Contains(p.id)); userDict = users.ToDictionary(p => p.id, p => p.nickName ?? p.mobile ?? $"用户{p.id}"); } // 组装返回数据 var resultList = list.Select(p => new { p.id, p.user_id, p.reservation_id, p.room_id, p.room_number, p.room_name, p.room_fee, p.earnings, p.type, typeName = p.type == 1 ? "佣金" : "鸽子费", p.remark, p.create_time, p.operator_id, nickName = userDict.ContainsKey(p.user_id) ? userDict[p.user_id] : $"用户{p.user_id}" }).ToList(); jm.data = resultList; jm.code = 0; jm.count = list.TotalCount; jm.msg = "数据调用成功!"; return jm; } #endregion #region 首页数据 /// /// 首页数据 /// /// [HttpPost] [Description("首页数据")] public AdminUiCallBack GetIndex() { var jm = new AdminUiCallBack { code = 0 }; return jm; } #endregion #region 创建数据(添加收益) /// /// 创建页面 /// /// [HttpPost] [Description("创建页面")] public AdminUiCallBack GetCreate() { var jm = new AdminUiCallBack { code = 0 }; return jm; } /// /// 创建提交(添加收益) /// /// /// [HttpPost] [Description("添加收益")] public async Task DoCreate([FromBody] AddEarningsRequest entity) { var jm = new AdminUiCallBack(); // 获取当前登录管理员ID var operatorId = HttpContext.User.Claims.FirstOrDefault(c => c.Type == "id")?.Value.ObjectToInt(0) ?? 0; var result = await _sQEarningsServices.AddEarningsAsync( entity.user_id, entity.reservation_id, entity.room_id, entity.room_number, entity.room_name, entity.room_fee??0, entity.earnings ?? 0, entity.type ?? 1, entity.remark, operatorId); jm.code = result.status ? 0 : 1; jm.msg = result.msg; return jm; } #endregion #region 删除数据 /// /// 删除数据 /// /// /// [HttpPost] [Description("删除数据")] public async Task DoDelete([FromBody] FMIntId entity) { var jm = new AdminUiCallBack(); var result = await _sQEarningsServices.DeleteByIdAsync(entity.id); jm.code = result.code; jm.msg = result.msg; return jm; } /// /// 批量删除 /// /// /// [HttpPost] [Description("批量删除")] public async Task DoBatchDelete([FromBody] FMArrayIntIds entity) { var jm = new AdminUiCallBack(); var result = await _sQEarningsServices.DeleteByIdsAsync(entity.id); jm.code = result.code; jm.msg = result.msg; return jm; } #endregion #region 获取用户列表(选择用户用) /// /// 获取用户列表 /// /// [HttpPost] [Description("获取用户列表")] public async Task GetUserList() { 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 keyword = Request.Form["keyword"].FirstOrDefault(); if (!string.IsNullOrEmpty(keyword)) { where = where.And(p => p.nickName.Contains(keyword) || p.mobile.Contains(keyword) || p.id.ToString() == keyword); } where = where.And(p => p.isDelete == false); var list = await _userServices.QueryPageAsync(where, p => p.id, OrderByType.Desc, pageCurrent, pageSize); var resultList = list.Select(p => new { p.id, p.nickName, p.mobile, p.avatarImage, displayName = p.nickName ?? p.mobile ?? $"用户{p.id}" }).ToList(); jm.data = resultList; jm.code = 0; jm.count = list.TotalCount; jm.msg = "数据调用成功!"; return jm; } #endregion #region 获取房间列表(选择房间用) /// /// 获取房间列表 /// /// [HttpPost] [Description("获取房间列表")] public async Task GetRoomList() { var jm = new AdminUiCallBack(); var rooms = await _sQRoomsServices.QueryListByClauseAsync(p => p.status); var resultList = rooms.Select(p => new { p.id, room_number = p.id, room_name= p.name, displayName = $"{p.id}({p.name})" }).ToList(); jm.data = resultList; jm.code = 0; jm.msg = "数据调用成功!"; return jm; } #endregion } /// /// 添加收益请求 /// public class AddEarningsRequest { /// /// 用户ID /// public int user_id { get; set; } /// /// 预约ID /// public int? reservation_id { get; set; } /// /// 房间ID /// public int? room_id { get; set; } /// /// 房号 /// public string? room_number { get; set; } /// /// 房名 /// public string? room_name { get; set; } /// /// 房费 /// public decimal? room_fee { get; set; } /// /// 收益金额 /// public decimal? earnings { get; set; } /// /// 类型:1=佣金,2=鸽子费 /// public int? type { get; set; } = 1; /// /// 备注 /// public string? remark { get; set; } } }