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