Files
number_zj/20220330_Vote/Ewide.RoadFlow/Data/Message/Message.cs
2022-03-30 17:54:33 +08:00

244 lines
12 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.
using Ewide.Core;
using Furion.DependencyInjection;
using Microsoft.Extensions.Caching.Memory;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Localization;
using Newtonsoft.Json.Linq;
using RoadFlow.Utility;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace RoadFlow.Data
{
public class Message: RoadFlowRepository<RoadFlow.Model.rf_message>, IMessage, ITransient
{
/// <summary>
/// 发送一条消息(VUE版本)
/// </summary>
/// <param name="message"></param>
/// <param name="receiveUsers">接收人员如果为空则从message.ReceiverIdString中取</param>
/// <param name="url">要连接的地址</param>
/// <param name="language">语言包</param>
/// <returns>返回1表示成功其它为错误信息</returns>
public string VueSend(Model.rf_message message, IEnumerable<SysUser> receiveUsers = null, string url = "", IConfigurationSection language = null)
{
if (null == message)
{
return language != null && language.GetSection("sendmsg_empty") != null ? language.GetSection("sendmsg_empty").Value : "消息为空!";
}
if (receiveUsers == null)
{
receiveUsers = new Organize().GetAllUsers(message.ReceiverIdString);
}
if (!receiveUsers.Any())
{
return language != null && language.GetSection("sendmsg_notreceiver") != null ? language.GetSection("sendmsg_notreceiver").Value : "消息没有接收人!";
}
if (message.ReceiverIdString.IsNullOrEmpty())
{
StringBuilder stringBuilder = new StringBuilder();
foreach (var u in receiveUsers)
{
stringBuilder.Append(IOrganize.PREFIX_USER);
stringBuilder.Append(u.Id);
stringBuilder.Append(",");
}
message.ReceiverIdString = stringBuilder.ToString().TrimEnd(',');
}
List<Model.rf_messageuser> messageUsers = new List<Model.rf_messageuser>();
List<string> userIDList = new List<string>();//记录用户ID用于发送singalr消息
string[] sendTypes = message.SendType.Split(',');
foreach (string sendType in sendTypes)
{
if (!sendType.IsInt(out int t))
{
continue;
}
switch (t)
{
case 0://站内短信
foreach (var user in receiveUsers)
{
messageUsers.Add(new Model.rf_messageuser()
{
MessageId = message.Id,
UserId = user.Id,
IsRead = 0
});
userIDList.Add(user.Id.ToString().ToLower());
}
break;
case 1://手机短信
StringBuilder mobiles = new StringBuilder();
foreach (var user in receiveUsers)
{
if (!user.Phone.IsNullOrWhiteSpace())
{
mobiles.Append(user.Phone);
mobiles.Append(",");
}
}
SMS.SendSMS(message.Contents.RemoveHTML(), mobiles.ToString().TrimEnd(','));
break;
case 2://企业微信
/* if (Config.EnterpriseWeChatIsUse)
{
if (message.Type == 20)
{
if (!url.ContainsIgnoreCase("&ismobile="))
{
url += "&ismobile=1";
}
if (!url.ContainsIgnoreCase("&ismessage="))
{
url += "&ismessage=1";
}
}
string linkUrl = url.IsNullOrWhiteSpace() && message.Type == 1
? Config.EnterpriseWeChatWebUrl + "/?loadurl=" + ("/mobile/message-show?messageid=" + message.Id.ToString()).UrlEncode()
: Config.EnterpriseWeChatWebUrl + "/?loadurl=" + url.UrlEncode();
string msgTitle = message.Type == 20 ? (language != null && language.GetSection("sendmsg_todo") != null ? language.GetSection("sendmsg_todo").Value : "待办事项")
: (language != null && language.GetSection("sendmsg_msg") != null ? language.GetSection("sendmsg_msg").Value : "消息");
string msgDescription = "<div class=\"normal\">" + message.Contents + "</div><div class=\"gray\">"
+ (message.SenderName.IsNullOrWhiteSpace() ? "" : (language != null && language.GetSection("sendmsg_sender") != null ? language.GetSection("sendmsg_sender").Value : "发送人") + "" + message.SenderName)
+ " " + (language != null && language.GetSection("sendmsg_time") != null ? language.GetSection("sendmsg_time").Value : "时间") + "" + message.SendTime.ToShortDateTimeString() + "</div>";
string msgBtnText = message.Type == 20 ? (language != null && language.GetSection("sendmsg_handle") != null ? language.GetSection("sendmsg_handle").Value : "点击处理")
: (language != null && language.GetSection("sendmsg_info") != null ? language.GetSection("sendmsg_info").Value : "详情");
//每次最大只能发1000人所以这里要分段
List<List<Model.User>> toUsers = new List<List<Model.User>>();
int skip = 1000;
int number = 1;
while (skip == 1000)
{
var userList = receiveUsers.Skip(number++ * 1000 - 1000).Take(1000).ToList();
toUsers.Add(userList);
skip = userList.Count;
}
EnterpriseWeChat.Message weChatMessage = new EnterpriseWeChat.Message();
foreach (var toUserList in toUsers)
{
StringBuilder msgReceiveUsers = new StringBuilder();
foreach (var receiveUser in toUserList)
{
msgReceiveUsers.Append(receiveUser.Account + "|");
}
weChatMessage.SendTextCard(msgTitle, msgDescription, msgBtnText, linkUrl, msgReceiveUsers.ToString().TrimEnd('|'));
}
}*/
break;
}
}
//发送singalr消息
if (userIDList.Count > 0)
{
JObject jObject = new JObject
{
{ "id", message.Id.ToString() },
{ "title", message.Type == 20 ? language != null && language.GetSection("sendmsg_todomsg") != null ? language.GetSection("sendmsg_todomsg").Value : "待办任务消息"
: language != null && language.GetSection("sendmsg_msg") != null ? language.GetSection("sendmsg_msg").Value : "消息" },
{ "contents", message.Contents },
{ "linkUrl", message.Files.IsNullOrWhiteSpace() ? "" : message.Files },
{ "count", 1 }
};
new Business.SignalR.SignalRHub().SendMessage(jObject.ToString(Newtonsoft.Json.Formatting.None), userIDList);
}
return Add(message, messageUsers.ToArray()) > 0 ? "1" : language != null && language.GetSection("sendmsg_fail") != null ? language.GetSection("sendmsg_fail").Value : "发送失败!";
}
/// <summary>
/// 添加一批消息
/// </summary>
/// <param name="message">消息实体</param>
/// <param name="messageUsers">阅读人员</param>
/// <returns></returns>
public int Add(Model.rf_message message, Model.rf_messageuser[] messageUsers)
{
return 1;
//this.Add(message);
}
/// <summary>
/// 查询一页已发送消息
/// </summary>
/// <param name="count"></param>
/// <param name="size"></param>
/// <param name="number"></param>
/// <param name="contents"></param>
/// <param name="date1"></param>
/// <param name="date2"></param>
/// <param name="status">0自己发送的消息 1未读消息 2已读消息</param>
/// <param name="order"></param>
/// <returns></returns>
public List<Model.rf_message> GetSendList(out int count, int size, int number, string userId, string contents, string date1, string date2, string status, string order)
{
int total = 0;
var rtn = db.Queryable<Model.rf_message>()
.WhereIF(status == "1",
x => SqlFunc.Subqueryable<Model.rf_messageuser>().Where(y => y.MessageId == x.Id && y.IsRead == 0 && y.UserId == userId).Count() > 0)
.WhereIF(status == "2",
x => SqlFunc.Subqueryable<Model.rf_messageuser>().Where(y => y.MessageId == x.Id && y.IsRead == 1 && y.UserId == userId).Count() > 0)
.WhereIF(status == "0",
x => x.SenderId == userId)
.WhereIF(!contents.IsNullOrWhiteSpace(),
x => x.Contents.Contains(contents.Trim()))
.WhereIF(date1.IsDateTime(out DateTime dt),
x => x.SendTime >= dt.GetDate())
.WhereIF(date2.IsDateTime(out DateTime dt1),
x => x.SendTime < dt1.GetDate()
)
.OrderByIF(!order.IsNullOrWhiteSpace(), order.FilterSelectSql())
.ToPageList(number, size, ref total).ToList();
count = total;
return rtn;
}
/// <summary>
/// 得到发送方式字符串
/// </summary>
/// <param name="receiveType">发送方式 0站内消息 1手机短信 2微信 </param>
/// <param name="localizer">语言包</param>
/// <returns></returns>
public string GetSendTypeString(string sendType, IStringLocalizer localizer = null)
{
if (sendType.IsNullOrWhiteSpace())
{
return string.Empty;
}
string[] types = sendType.Split(',');
StringBuilder stringBuilder = new StringBuilder();
foreach (string type in types)
{
if (!type.IsInt(out int t))
{
continue;
}
switch (t)
{
case 0:
stringBuilder.Append(localizer == null ? "站内消息、" : localizer["MessageType0"] + "、");
break;
case 1:
stringBuilder.Append(localizer == null ? "手机短信、" : localizer["MessageType1"] + "、");
break;
case 2:
stringBuilder.Append(localizer == null ? "微信、" : localizer["MessageType2"] + "、");
break;
}
}
return stringBuilder.ToString().TrimEnd('、');
}
}
}