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, IMessage, ITransient { /// /// 发送一条消息(VUE版本) /// /// /// 接收人员,如果为空则从message.ReceiverIdString中取 /// 要连接的地址 /// 语言包 /// 返回1表示成功,其它为错误信息 public string VueSend(Model.rf_message message, IEnumerable 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 messageUsers = new List(); List userIDList = new List();//记录用户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 = "
" + message.Contents + "
" + (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() + "
"; 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> toUsers = new List>(); 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 : "发送失败!"; } /// /// 添加一批消息 /// /// 消息实体 /// 阅读人员 /// public int Add(Model.rf_message message, Model.rf_messageuser[] messageUsers) { return 1; //this.Add(message); } /// /// 查询一页已发送消息 /// /// /// /// /// /// /// /// 0自己发送的消息 1未读消息 2已读消息 /// /// public List 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() .WhereIF(status == "1", x => SqlFunc.Subqueryable().Where(y => y.MessageId == x.Id && y.IsRead == 0 && y.UserId == userId).Count() > 0) .WhereIF(status == "2", x => SqlFunc.Subqueryable().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; } /// /// 得到发送方式字符串 /// /// 发送方式 0站内消息 1手机短信 2微信 /// 语言包 /// 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('、'); } } }