487 lines
15 KiB
C#
487 lines
15 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 SQMessageController : ControllerBase
|
||
{
|
||
private readonly IWebHostEnvironment _webHostEnvironment;
|
||
private readonly ISQMessageServices _sQMessageServices;
|
||
private readonly ICoreCmsUserServices _userServices;
|
||
|
||
/// <summary>
|
||
/// 构造函数
|
||
/// </summary>
|
||
public SQMessageController(
|
||
IWebHostEnvironment webHostEnvironment,
|
||
ISQMessageServices sQMessageServices,
|
||
ICoreCmsUserServices userServices)
|
||
{
|
||
_webHostEnvironment = webHostEnvironment;
|
||
_sQMessageServices = sQMessageServices;
|
||
_userServices = userServices;
|
||
}
|
||
|
||
#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<SQMessage>();
|
||
|
||
// 获取排序字段
|
||
var orderField = Request.Form["orderField"].FirstOrDefault();
|
||
Expression<Func<SQMessage, object>> 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<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.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 首页数据
|
||
|
||
/// <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] 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 编辑数据
|
||
|
||
/// <summary>
|
||
/// 编辑页面
|
||
/// </summary>
|
||
/// <param name="entity"></param>
|
||
/// <returns></returns>
|
||
[HttpPost]
|
||
[Description("编辑页面")]
|
||
public async Task<AdminUiCallBack> 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;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 编辑提交
|
||
/// </summary>
|
||
/// <param name="entity"></param>
|
||
/// <returns></returns>
|
||
[HttpPost]
|
||
[Description("编辑提交")]
|
||
public async Task<AdminUiCallBack> 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 删除数据
|
||
|
||
/// <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 _sQMessageServices.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 _sQMessageServices.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> 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;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 发送消息给多个用户
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
[HttpPost]
|
||
[Description("发送消息给多个用户")]
|
||
public async Task<AdminUiCallBack> 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;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 发送全员广播
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
[HttpPost]
|
||
[Description("发送全员广播")]
|
||
public async Task<AdminUiCallBack> 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 获取用户列表(用于选择发送对象)
|
||
|
||
/// <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 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 请求模型
|
||
|
||
/// <summary>
|
||
/// 发送消息请求
|
||
/// </summary>
|
||
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; }
|
||
}
|
||
|
||
/// <summary>
|
||
/// 发送消息给多个用户请求
|
||
/// </summary>
|
||
public class SendMessageToUsersRequest
|
||
{
|
||
public List<int> userIds { get; set; }
|
||
public string title { get; set; }
|
||
public string content { get; set; }
|
||
public int messageType { get; set; } = 1;
|
||
public int? senderId { get; set; }
|
||
}
|
||
|
||
/// <summary>
|
||
/// 发送全员广播请求
|
||
/// </summary>
|
||
public class SendBroadcastRequest
|
||
{
|
||
public string title { get; set; }
|
||
public string content { get; set; }
|
||
public int? senderId { get; set; }
|
||
}
|
||
|
||
#endregion
|
||
}
|