244 lines
12 KiB
C#
244 lines
12 KiB
C#
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('、');
|
||
}
|
||
|
||
|
||
|
||
}
|
||
}
|