using AppletMvcService.Hanlder; using AppletMvcService.Models; using Microsoft.AspNet.SignalR; using System; using System.Collections.Generic; using System.Linq; using WX.CRM.Common; namespace AppletMvcService { public class ChatHub : Hub { //public void Send(string name, string message) //{ // Clients.All.broadcastMessage(name, message); //} /// /// 给客服发送消息 /// /// /// /// public static void SendAllMessage(string toUserId, string fromUserId, string message, string msgType, string accountnum, int isNew) { //CustoemrDetail detial = CustomerUsers.FirstOrDefault(m => m.OpenId == fromUserId); UserDetail xx = ConnectedUsers[accountnum].FirstOrDefault(m => m.UserID == toUserId); if (xx == null) { LogHelper.Info("工号:" + toUserId + "不在线,content:" + message + ",add unread msg"); return; } if (isNew == 1) { CustoemrDetail detial = new CustoemrDetail(); detial.OpenId = fromUserId; detial.NickName = "客户"; detial.ConnectionId = fromUserId; detial.HeaderUrl = ""; detial.LoginTime = DateTime.Now; detial = MessageHandler.GetCustomerHeadInfo(detial); //添加登陆者 MessageHandler.GetCustomerHeadInfo(detial); Microsoft.AspNet.SignalR.GlobalHost.ConnectionManager.GetHubContext().Clients.Client(xx.ConnectionId).onNewUserConnected(fromUserId, fromUserId, detial.NickName, "微信", detial.HeaderUrl, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); } Microsoft.AspNet.SignalR.GlobalHost.ConnectionManager.GetHubContext().Clients.Client(xx.ConnectionId).receivePrivateMessage(fromUserId, message, msgType); } #region Data Members private static Dictionary> _connectedUsers; public static Dictionary> ConnectedUsers { get { if (_connectedUsers == null || _connectedUsers.Count == 0) { _connectedUsers = MessageHandler.GetConnectedByRedis(); } return ChatHub._connectedUsers; } set { ChatHub._connectedUsers = value; } } //public static List CustomerUsers = new List();//客户在线列表 //public static string ConectedEids = string.Empty; #endregion //心跳 public void Alive(string userId, string accountnum) { //LogHelper.Info("alive==========" + userId); UserDetail xx = ConnectedUsers[accountnum].FirstOrDefault(m => m.UserID == userId); Microsoft.AspNet.SignalR.GlobalHost.ConnectionManager.GetHubContext().Clients.Client(xx.ConnectionId).getAlive(userId); } /// /// 登录连线 /// /// 用户ID /// 用户名 /// 部门名 /// 公众号 public void Connect(string userID, string userName, string deptName, string accountnum) { try { var id = Context.ConnectionId; if (!ConnectedUsers.ContainsKey(accountnum)) ConnectedUsers.Add(accountnum, new List()); LogHelper.Info("登录系统!" + userID); if (ConnectedUsers[accountnum].Count(x => x.ConnectionId == id) == 0) { if (ConnectedUsers[accountnum].Count(x => x.UserID == userID) > 0) { var items = ConnectedUsers[accountnum].Where(x => x.UserID == userID).ToList(); foreach (var item in items) { Clients.AllExcept(id).onUserDisconnected(item.ConnectionId, item.UserName); } ConnectedUsers[accountnum].RemoveAll(x => x.UserID == userID); } //ConectedEids += "[" + userID + "]"; //添加在线人员 UserDetail detial = new UserDetail { ConnectionId = id, UserID = userID, UserName = userName, DeptName = deptName, LoginTime = DateTime.Now }; ConnectedUsers[accountnum].Add(detial); MessageHandler.AddConnectedToRedis(detial, accountnum);//--redis新增 // 反馈信息给登录者 Clients.Caller.onConnected(id, userName, MessageHandler.GetFriends(Convert.ToDecimal(userID), accountnum)); //LogHelper.Info(string.Format("ConnectionId = {0}, UserID = {1}, UserName = {2}, DeptName = {3}", id, userID, userName, deptName)); // 通知所有用户,有新用户连接 //Clients.AllExcept(id).onNewUserConnected(id, userID, userName, deptName, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); } } catch (Exception ex) { LogHelper.Error(ex.ToString()); } } /// /// 发送私聊 /// /// 接收方用户连接ID /// 内容 public void SendPrivateMessage(string toUserId, string message, int eid, string accountnum) { //string fromUserId = Context.ConnectionId; //var toUser = ConnectedUsers.FirstOrDefault(x => x.ConnectionId == toUserId); //var fromUser = ConnectedUsers.FirstOrDefault(x => x.ConnectionId == fromUserId); //if (toUser != null && fromUser != null) //{ // send to MessageHandler.SendMsg(toUserId, message, eid, accountnum); //Clients.Client(toUserId).receivePrivateMessage(fromUserId, fromUser.UserName, message); // send to caller user //Clients.Caller.sendPrivateMessage(toUserId, fromUser.UserName, message); //} //else //{ // //表示对方不在线 // Clients.Caller.absentSubscriber();Class1.cs //} } /// /// 批量发送 /// /// 接收人openID用“,”隔开 /// 消息 /// 公众号 public void SendQFMessage(string toUserIds, string message, int eid, string accountnum) { LogHelper.Info("批量发送消息:" + toUserIds + ",message:" + message + ",accountnum:" + accountnum); if (string.IsNullOrEmpty(toUserIds)) { return; } string[] openIds = toUserIds.Split(','); foreach (string openId in openIds) { if (string.IsNullOrEmpty(openId)) continue; MessageHandler.SendMsg(openId, message, eid, accountnum); } } ///// ///// 发送素材消息 ///// ///// 目标人 ///// 素材名称 ///// 素材ID ///// 素材类型 ///// 素材地址 ///// 公众号 //public void SendSuCaiMessage(string toUserId, string name, string media_id, string sucaitype, string url, string accountnum) //{ // if (sucaitype != "news") // { // ImageMsg msg = new ImageMsg(); // msg.media_id = media_id; // MessageHandler.SendImgMsg(msg, sucaitype, toUserId, accountnum); // //if (MessageHandler.IsNeedDownLoadSuCai(media_id)) // //{ // // string imagepath=MessageHandler.DownLoadSuCaiPath(media_id, url); // // MessageHandler.appletmsg.WeapAddFilePath(0, media_id, imagepath); // //} // } //} /// /// 离线 /// public override System.Threading.Tasks.Task OnDisconnected(bool stopCalled) { try { //LogHelper.Error("有人离线了," + Context.ConnectionId); foreach (var unn in ConnectedUsers) { //LogHelper.Error("公众号:" + unn.Key + ",在线人数:" + unn.Value.Count); var item = unn.Value.FirstOrDefault(x => x.ConnectionId == Context.ConnectionId); if (item != null) { MessageHandler.RemoveConnectedToRedis(item, unn.Key);//--redis新增 //ConectedEids.Replace("[" + item.UserID + "]", ""); //LogHelper.Info("客服离线:" + item.UserID); //Clients.All.onUserDisconnected(item.ConnectionId, item.UserName); //调用客户端用户离线通知 ConnectedUsers[unn.Key].Remove(item); break; } } } catch (Exception xx) { LogHelper.Error(xx.ToString()); } return base.OnDisconnected(stopCalled); } } }