/***********************************************************************
* 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; }
}
}