/***********************************************************************
* 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 SQMessageController : ControllerBase
{
private readonly IWebHostEnvironment _webHostEnvironment;
private readonly ISQMessageServices _sQMessageServices;
private readonly ICoreCmsUserServices _userServices;
///
/// 构造函数
///
public SQMessageController(
IWebHostEnvironment webHostEnvironment,
ISQMessageServices sQMessageServices,
ICoreCmsUserServices userServices)
{
_webHostEnvironment = webHostEnvironment;
_sQMessageServices = sQMessageServices;
_userServices = userServices;
}
#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,
"title" => p => p.title,
"target_type" => p => p.target_type,
"message_type" => p => p.message_type,
"created_at" => p => p.created_at,
_ => 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 title = Request.Form["title"].FirstOrDefault();
if (!string.IsNullOrEmpty(title))
{
where = where.And(p => p.title.Contains(title));
}
var targetType = Request.Form["target_type"].FirstOrDefault();
if (!string.IsNullOrEmpty(targetType))
{
var targetTypeInt = targetType.ObjectToInt(-1);
if (targetTypeInt >= 0)
{
where = where.And(p => p.target_type == targetTypeInt);
}
}
var messageType = Request.Form["message_type"].FirstOrDefault();
if (!string.IsNullOrEmpty(messageType))
{
var messageTypeInt = messageType.ObjectToInt(-1);
if (messageTypeInt >= 0)
{
where = where.And(p => p.message_type == messageTypeInt);
}
}
// 获取数据
var list = await _sQMessageServices.QueryPageAsync(where, orderEx, orderBy, pageCurrent, pageSize, true);
// 关联查询用户昵称
var userIds = list.Where(p => p.user_id.HasValue && p.user_id > 0)
.Select(p => p.user_id.Value)
.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.target_type,
p.title,
p.content,
p.message_type,
p.is_read,
p.sender_id,
p.related_type,
p.related_id,
p.created_at,
p.updated_at,
nickName = p.user_id.HasValue && userDict.ContainsKey(p.user_id.Value)
? userDict[p.user_id.Value]
: (p.target_type == 1 ? "全员广播" : "-")
}).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] SQMessage entity)
{
var jm = new AdminUiCallBack();
entity.created_at = DateTime.Now;
entity.is_read = false;
var result = await _sQMessageServices.InsertAsync(entity);
jm.code = result.code;
jm.msg = result.msg;
return jm;
}
#endregion
#region 编辑数据
///
/// 编辑页面
///
///
///
[HttpPost]
[Description("编辑页面")]
public async Task GetEdit([FromBody] FMIntId entity)
{
var jm = new AdminUiCallBack();
var model = await _sQMessageServices.QueryByIdAsync(entity.id);
if (model == null)
{
jm.msg = "不存在此信息";
return jm;
}
jm.code = 0;
jm.data = model;
return jm;
}
///
/// 编辑提交
///
///
///
[HttpPost]
[Description("编辑提交")]
public async Task DoEdit([FromBody] SQMessage entity)
{
var jm = new AdminUiCallBack();
entity.updated_at = DateTime.Now;
var result = await _sQMessageServices.UpdateAsync(entity);
jm.code = result.code;
jm.msg = result.msg;
return jm;
}
#endregion
#region 删除数据
///
/// 删除数据
///
///
///
[HttpPost]
[Description("删除数据")]
public async Task DoDelete([FromBody] FMIntId entity)
{
var jm = new AdminUiCallBack();
var result = await _sQMessageServices.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 _sQMessageServices.DeleteByIdsAsync(entity.id);
jm.code = result.code;
jm.msg = result.msg;
return jm;
}
#endregion
#region 发送消息
///
/// 发送消息给指定用户
///
///
[HttpPost]
[Description("发送消息给指定用户")]
public async Task SendToUser([FromBody] SendMessageRequest request)
{
var jm = new AdminUiCallBack();
if (request.userId <= 0)
{
jm.msg = "请选择用户";
return jm;
}
if (string.IsNullOrEmpty(request.title) || string.IsNullOrEmpty(request.content))
{
jm.msg = "请填写标题和内容";
return jm;
}
var result = await _sQMessageServices.SendToUserAsync(
request.userId,
request.title,
request.content,
request.messageType,
request.senderId);
jm.code = result ? 0 : 1;
jm.msg = result ? "发送成功" : "发送失败";
return jm;
}
///
/// 发送消息给多个用户
///
///
[HttpPost]
[Description("发送消息给多个用户")]
public async Task SendToUsers([FromBody] SendMessageToUsersRequest request)
{
var jm = new AdminUiCallBack();
if (request.userIds == null || request.userIds.Count == 0)
{
jm.msg = "请选择用户";
return jm;
}
if (string.IsNullOrEmpty(request.title) || string.IsNullOrEmpty(request.content))
{
jm.msg = "请填写标题和内容";
return jm;
}
var result = await _sQMessageServices.SendToUsersAsync(
request.userIds,
request.title,
request.content,
request.messageType,
request.senderId);
jm.code = result ? 0 : 1;
jm.msg = result ? "发送成功" : "发送失败";
return jm;
}
///
/// 发送全员广播
///
///
[HttpPost]
[Description("发送全员广播")]
public async Task SendBroadcast([FromBody] SendBroadcastRequest request)
{
var jm = new AdminUiCallBack();
if (string.IsNullOrEmpty(request.title) || string.IsNullOrEmpty(request.content))
{
jm.msg = "请填写标题和内容";
return jm;
}
var result = await _sQMessageServices.SendBroadcastAsync(
request.title,
request.content,
request.senderId);
jm.code = result ? 0 : 1;
jm.msg = result ? "发送成功" : "发送失败";
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 nickName = Request.Form["nickName"].FirstOrDefault();
if (!string.IsNullOrEmpty(nickName))
{
where = where.And(p => p.nickName.Contains(nickName));
}
var mobile = Request.Form["mobile"].FirstOrDefault();
if (!string.IsNullOrEmpty(mobile))
{
where = where.And(p => p.mobile.Contains(mobile));
}
var list = await _userServices.QueryPageAsync(where, p => p.id, OrderByType.Desc, pageCurrent, pageSize);
jm.data = list;
jm.code = 0;
jm.count = list.TotalCount;
jm.msg = "数据调用成功!";
return jm;
}
#endregion
}
#region 请求模型
///
/// 发送消息请求
///
public class SendMessageRequest
{
public int userId { get; set; }
public string title { get; set; }
public string content { get; set; }
public int messageType { get; set; } = 1;
public int? senderId { get; set; }
}
///
/// 发送消息给多个用户请求
///
public class SendMessageToUsersRequest
{
public List userIds { get; set; }
public string title { get; set; }
public string content { get; set; }
public int messageType { get; set; } = 1;
public int? senderId { get; set; }
}
///
/// 发送全员广播请求
///
public class SendBroadcastRequest
{
public string title { get; set; }
public string content { get; set; }
public int? senderId { get; set; }
}
#endregion
}