mahjong_group/server/CoreCms.Net.Web.Admin/Controllers/SQ/SQMessageController.cs
2026-01-01 14:35:52 +08:00

487 lines
15 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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