394 lines
12 KiB
C#
394 lines
12 KiB
C#
/***********************************************************************
|
||
* 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
|
||
{
|
||
/// <summary>
|
||
/// 收益管理
|
||
/// </summary>
|
||
[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;
|
||
|
||
/// <summary>
|
||
/// 构造函数
|
||
/// </summary>
|
||
public SQEarningsController(
|
||
IWebHostEnvironment webHostEnvironment,
|
||
ISQEarningsServices sQEarningsServices,
|
||
ICoreCmsUserServices userServices,
|
||
ISQRoomsServices sQRoomsServices,
|
||
ISQReservationsServices sQReservationsServices)
|
||
{
|
||
_webHostEnvironment = webHostEnvironment;
|
||
_sQEarningsServices = sQEarningsServices;
|
||
_userServices = userServices;
|
||
_sQRoomsServices = sQRoomsServices;
|
||
_sQReservationsServices = sQReservationsServices;
|
||
}
|
||
|
||
#region 获取列表
|
||
|
||
/// <summary>
|
||
/// 获取收益记录列表
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
[HttpPost]
|
||
[Description("获取收益记录列表")]
|
||
public async Task<AdminUiCallBack> 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<SQEarningsRecord>();
|
||
|
||
// 获取排序字段
|
||
var orderField = Request.Form["orderField"].FirstOrDefault();
|
||
Expression<Func<SQEarningsRecord, object>> 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<int, string>();
|
||
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 首页数据
|
||
|
||
/// <summary>
|
||
/// 首页数据
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
[HttpPost]
|
||
[Description("首页数据")]
|
||
public AdminUiCallBack GetIndex()
|
||
{
|
||
var jm = new AdminUiCallBack { code = 0 };
|
||
return jm;
|
||
}
|
||
|
||
#endregion
|
||
|
||
#region 创建数据(添加收益)
|
||
|
||
/// <summary>
|
||
/// 创建页面
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
[HttpPost]
|
||
[Description("创建页面")]
|
||
public AdminUiCallBack GetCreate()
|
||
{
|
||
var jm = new AdminUiCallBack { code = 0 };
|
||
return jm;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 创建提交(添加收益)
|
||
/// </summary>
|
||
/// <param name="entity"></param>
|
||
/// <returns></returns>
|
||
[HttpPost]
|
||
[Description("添加收益")]
|
||
public async Task<AdminUiCallBack> 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 删除数据
|
||
|
||
/// <summary>
|
||
/// 删除数据
|
||
/// </summary>
|
||
/// <param name="entity"></param>
|
||
/// <returns></returns>
|
||
[HttpPost]
|
||
[Description("删除数据")]
|
||
public async Task<AdminUiCallBack> 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;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 批量删除
|
||
/// </summary>
|
||
/// <param name="entity"></param>
|
||
/// <returns></returns>
|
||
[HttpPost]
|
||
[Description("批量删除")]
|
||
public async Task<AdminUiCallBack> 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 获取用户列表(选择用户用)
|
||
|
||
/// <summary>
|
||
/// 获取用户列表
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
[HttpPost]
|
||
[Description("获取用户列表")]
|
||
public async Task<AdminUiCallBack> 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<CoreCmsUser>();
|
||
|
||
// 搜索条件
|
||
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 获取房间列表(选择房间用)
|
||
|
||
/// <summary>
|
||
/// 获取房间列表
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
[HttpPost]
|
||
[Description("获取房间列表")]
|
||
public async Task<AdminUiCallBack> 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
|
||
}
|
||
|
||
/// <summary>
|
||
/// 添加收益请求
|
||
/// </summary>
|
||
public class AddEarningsRequest
|
||
{
|
||
/// <summary>
|
||
/// 用户ID
|
||
/// </summary>
|
||
public int user_id { get; set; }
|
||
|
||
/// <summary>
|
||
/// 预约ID
|
||
/// </summary>
|
||
public int? reservation_id { get; set; }
|
||
|
||
/// <summary>
|
||
/// 房间ID
|
||
/// </summary>
|
||
public int? room_id { get; set; }
|
||
|
||
/// <summary>
|
||
/// 房号
|
||
/// </summary>
|
||
public string? room_number { get; set; }
|
||
|
||
/// <summary>
|
||
/// 房名
|
||
/// </summary>
|
||
public string? room_name { get; set; }
|
||
|
||
/// <summary>
|
||
/// 房费
|
||
/// </summary>
|
||
public decimal? room_fee { get; set; }
|
||
|
||
/// <summary>
|
||
/// 收益金额
|
||
/// </summary>
|
||
public decimal? earnings { get; set; }
|
||
|
||
/// <summary>
|
||
/// 类型:1=佣金,2=鸽子费
|
||
/// </summary>
|
||
public int? type { get; set; } = 1;
|
||
|
||
/// <summary>
|
||
/// 备注
|
||
/// </summary>
|
||
public string? remark { get; set; }
|
||
}
|
||
}
|