using EasyBL; using Entity.Sugar; using Microsoft.AspNet.SignalR; using Microsoft.AspNet.SignalR.Hubs; using Newtonsoft.Json; using SqlSugar.Base; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using WebApp.Models; using WebApp.Models.Hub; namespace WebApp.Hubs { [HubName("msgHub")] public class MsgHub : Hub { public static Online Euro_Online = new Online(); // 在線用户列表 public class Online { public Online() { Users = new List(); //在線用户列表 Rooms = new List(); //房間(群組) } //用戶集合 public List Users { get; set; } //房間集合 public List Rooms { get; set; } } /// /// 连线时调用 /// /// public override Task OnConnected() { //Console.WriteLine("客戶端連接,連接ID是:{0},當前在綫人數為{1}", Context.ConnectionId, Euro_Online.Users.Count + 1); return base.OnConnected(); } /// /// 断线时调用 /// /// /// public override Task OnDisconnected(bool stopCalled) { var user = Euro_Online.Users.Find(u => u.ConnectionId == Context.ConnectionId); // 判断用户是否存在,存在則刪除 if (user == null) { return base.OnDisconnected(stopCalled); } // 刪除用戶 Euro_Online.Users.Remove(user); var onlineUsers = Euro_Online.Users.Where(x => x.OrgId == user.OrgId).ToList(); var sIds = HubsTool.GetConnectionIdsByOrgID(user.OrgId); Clients.Clients(sIds).onUserDisconnected(user.ConnectionId, onlineUsers, user.OrgId, user.UserId, user.UserName, false);//調用客戶端用戶離線通知 var sTransferOrgID = Common.ConfigGetValue("", "TransferOrgID"); var sTransferUerID = Common.ConfigGetValue("", "TransferUerID"); var transfer = Euro_Online.Users.Find(u => (u.OrgId == sTransferOrgID && u.UserId == sTransferUerID)); if (transfer != null) { Clients.Client(transfer.ConnectionId).onUserDisconnected(user.ConnectionId, Euro_Online.Users, user.OrgId, user.UserId, user.UserName, false); } //Console.WriteLine("客戶端斷線,連接ID是:{0},當前在綫人數為{1}", Context.ConnectionId, OnlineUsers.Count); try { var db = SugarBase.DB; var iEf = db.Deleteable() .Where(it => it.OrgID == user.OrgId && it.UserID == user.UserId).ExecuteCommand(); } catch (Exception) { throw; } return base.OnDisconnected(stopCalled); } public override Task OnReconnected() { return base.OnReconnected(); } /// /// 登入連線 /// /// 組織Id /// /// /// public void Register(string orgid, string userid, string username, bool islogin) { var connnectId = Context.ConnectionId; var db = SugarBase.GetIntance(); if (Euro_Online.Users.Count(x => x.ConnectionId == connnectId) == 0) { if (Euro_Online.Users.Any(x => (x.UserId == userid /*&& x.OrgId == orgid*/))) { var item = Euro_Online.Users.First(x => (x.UserId == userid /*&& x.OrgId == orgid*/)); var oTicket = db.Queryable().First(it => it.UserID == userid /*&& it.OrgID == orgid*/); if (oTicket != null) { // 20180311 修改帳號登入不同單位自動登出 //var users = Euro_Online.Users.Where(x => x.OrgId == orgid).ToList(); var users = Euro_Online.Users.ToList(); //var _sIds = HubsTool.GetConnectionIdsByOrgID(orgid); var _sIds = Euro_Online.Users.Select(p => p.ConnectionId).ToList(); Clients.Clients(_sIds).onUserDisconnected(item.ConnectionId, users, item.OrgId, item.UserId, item.UserName, islogin, "IP:" + oTicket.LoginIp + "
DATETIME:" + oTicket.LoginTime); } Euro_Online.Users.RemoveAll(x => (x.UserId == userid && x.OrgId == orgid)); } var Info = new UserInfo { ConnectionId = connnectId, OrgId = orgid, UserId = userid, UserName = username, LastLoginTime = DateTime.Now }; //string sWSUrl = EasyBL.Common.GetAppSettings("WebServiceUrl"); //string[] Params = new string[1]; //Params[0] = "gstrUserId"; //string sParams = JsonConvert.SerializeObject(Params, Formatting.Indented); //把list轉成Json字串 //string sValue = (string)EasyBL.WebServiceUtil.InvokeWebService(sWSUrl, "GetSession", new object[] { Params }); //Dictionary dic_Session = JsonConvert.DeserializeObject>(sValue); //if (dic_Session["gstrUserId"] != null && dic_Session["gstrUserId"].ToString() != "") //{ // //添加在線人员 // Euro_Online.Users.Add(Info); //} //添加在線人员 Euro_Online.Users.Add(Info); //CreateRoom(usertype); //AddRoom(usertype); //Groups.Add(connnectId, usertype); try { var oNlineUser = new OTB_SYS_OnlineUsers { OrgID = orgid, UserID = userid }; var saOnlineUser = db.Queryable().Where(it => it.OrgID == orgid && it.UserID == userid).ToList(); if (saOnlineUser.Count == 0) { var iEf = db.Insertable(oNlineUser).ExecuteCommand(); } } catch (Exception) { throw; } } // 所有客戶端同步在線用户 var onlineUsers = Euro_Online.Users.Where(x => x.OrgId == orgid).ToList(); var sIds = HubsTool.GetConnectionIdsByOrgID(orgid); Clients.Clients(sIds).onConnected(connnectId, username, onlineUsers); var sTransferOrgID = Common.ConfigGetValue("", "TransferOrgID"); var sTransferUerID = Common.ConfigGetValue("", "TransferUerID"); var transfer = Euro_Online.Users.Find(u => (u.OrgId == sTransferOrgID && u.UserId == sTransferUerID)); if (transfer != null) { Clients.Client(transfer.ConnectionId).onConnected(connnectId, username, Euro_Online.Users); } } /// /// 登录连线 /// /// 組織Id /// 用户Id /// 用户名 public void Offline() { var user = Euro_Online.Users.Find(u => u.ConnectionId == Context.ConnectionId); // 判断用户是否存在,存在則刪除 if (user != null) { // 删除用户 var sIds = HubsTool.GetConnectionIdsByOrgID(user.OrgId); Euro_Online.Users.Remove(user); var onlineUsers = Euro_Online.Users.Where(x => x.OrgId == user.OrgId).ToList(); Clients.Clients(sIds).onUserDisconnected(user.ConnectionId, onlineUsers, user.OrgId, user.UserId, user.UserName, true);//調用客戶端用戶離線通知 var sTransferOrgID = Common.ConfigGetValue("", "TransferOrgID"); var sTransferUerID = Common.ConfigGetValue("", "TransferUerID"); var transfer = Euro_Online.Users.Find(u => (u.OrgId == sTransferOrgID && u.UserId == sTransferUerID)); if (transfer != null) { Clients.Client(transfer.ConnectionId).onUserDisconnected(user.ConnectionId, Euro_Online.Users, user.OrgId, user.UserId, user.UserName, true); } { var db = SugarBase.DB; var iEf = db.Deleteable() .Where(it => it.OrgID == user.OrgId && it.UserID == user.UserId).ExecuteCommand(); } } } /// /// 加入群組 /// /// 組名稱 /// 當前連線ID public void JoinGroup(string groupName, string connectionId) { if (string.IsNullOrEmpty(connectionId)) { connectionId = Context.ConnectionId; } Groups.Add(connectionId, groupName); Clients.All.hubMessage(connectionId + " joined group " + groupName); } public void LeaveGroup(string groupName, string connectionId) { if (string.IsNullOrEmpty(connectionId)) { connectionId = Context.ConnectionId; } Groups.Remove(connectionId, groupName); Clients.All.hubMessage(connectionId + " left group " + groupName); } //加入聊天室 public void AddRoom(string roomName) { //查询聊天室 var room = Euro_Online.Rooms.Find(a => a.RoomName == roomName); //存在則加入 if (room != null) { //查找房間中是否存在此用户 var isUser = room.Users.Find(w => w.ConnectionId == Context.ConnectionId); //不存在則加入 if (isUser == null) { var user = Euro_Online.Users.Find(a => a.ConnectionId == Context.ConnectionId); user.Rooms.Add(room); room.Users.Add(user); Groups.Add(Context.ConnectionId, roomName); //註冊加入聊天室的addRoom方法 Clients.Client(Context.ConnectionId).addRoom(roomName); } else { Clients.Client(Context.ConnectionId).showMessage("请勿重复加入房间"); } } } /// /// 更新所有用户的房间列表 /// private void GetRooms() { var rooms = JsonConvert.SerializeObject(Euro_Online.Rooms.Select(p => p.RoomName).ToList()); Clients.All.getRoomList(rooms); } /// /// 创建聊天室 /// /// public void CreateRoom(string roomName) { var room = Euro_Online.Rooms.Find(a => a.RoomName == roomName); if (room == null) { var r = new RoomInfo() { RoomName = roomName }; //将房间加入列表 Euro_Online.Rooms.Add(r); AddRoom(roomName); Clients.Client(Context.ConnectionId).showMessage("房间创建完成"); GetRooms(); } else { Clients.Client(Context.ConnectionId).showMessage("房间名重复"); } } /// /// 退出聊天室 /// /// public void ExitRoom(string roomName) { //查找房间是否存在 var room = Euro_Online.Rooms.Find(a => a.RoomName == roomName); //存在则删除 if (room != null) { //查找要删除的用户 var user = room.Users.Find(p => p.ConnectionId == Context.ConnectionId); //移除此用户 room.Users.Remove(user); //如果房间人数为0,怎删除房间 if (room.Users.Count == 0) { Euro_Online.Rooms.Remove(room); } //Groups Remove移除分组方法 Groups.Remove(Context.ConnectionId, roomName); //提示客户端 Clients.Client(Context.ConnectionId).removeRoom("退出成功"); } } /// /// 發送給自己 /// /// public void SendToMe(string value) { Clients.Caller.hubMessage(value); } /// /// 檢核當前頁面是否有人在操作 /// /// /// public void CheckEdit(string prgid, string dataid) { var connnectId = Context.ConnectionId; var bEdit = true; var sUserName = ""; foreach (UserInfo user in Euro_Online.Users) { if (user.ConnectionId != connnectId && user.Prgs.Count(p => p.FnId == prgid && p.DataId == dataid) > 0) { sUserName = user.UserName; bEdit = false; break; } } if (bEdit && Euro_Online.Users.Count(x => x.ConnectionId == connnectId) > 0) { foreach (UserInfo user in Euro_Online.Users) { if (user.ConnectionId == connnectId && user.Prgs.Count(p => p.FnId == prgid && p.DataId == dataid) == 0) { var prg = new EditPrgInfo { FnId = prgid, DataId = dataid }; user.Prgs.Add(prg); break; } } } Clients.Caller.checkedit(bEdit, prgid, sUserName); } /// /// 檢核當前頁面是否有人在操作 /// /// public void RemoveEditPrg(string prgid) { var connnectId = Context.ConnectionId; foreach (UserInfo user in Euro_Online.Users) { if (user.ConnectionId == connnectId) { var prg = user.Prgs.Find(p => p.FnId == prgid); if (prg != null) { user.Prgs.Remove(prg); break; } } } //Clients.Caller.checkEdit(bEdit); } /// /// 發送給指定人 /// /// /// public void SendToUser(string userId, string value) { Clients.User(userId).message(value); } public void SendToUsers(IList userIds, string value) { Clients.Users(userIds).message(value); } public void SendToConnectionId(string connectionId, string value) { Clients.Client(connectionId).hubMessage(value); } public void SendToAll(string value) { Clients.All.hubMessage(value); } public void SendToGroup(string groupName, string value) { Clients.Group(groupName).hubMessage(value); } public void Broadcast(OTB_SYS_Announcement msg) { //string sConnectionId = Context.ConnectionId; Clients.All.broadcast(msg); // 向所有客户端廣播 } public void Send(Message msg) { switch (msg.Type) { case MessageType.SendToMe: { Clients.Caller.receive(msg); break; } case MessageType.SendToConnectionId: { Clients.Client(msg.ConnectionId).receive(msg); // 特定的客户端,这个方法也就是我们实现端对端聊天的关键 break; } case MessageType.SendToUser: { var sId = HubsTool.GetConnectionId(msg.ToOrgId, msg.ToUserId); if (sId != "") { Clients.Client(sId).receive(msg); // 特定的客户端,这个方法也就是我们实现端对端聊天的关键 } break; } case MessageType.SendToUsers: { var sIds = HubsTool.GetConnectionIds(msg.ToUserIds); if (sIds.Count > 0) { Clients.Clients(sIds).receive(msg); // 特定的客户端,这个方法也就是我们实现端对端聊天的关键 } break; } case MessageType.SendBroadcast: { Clients.All.Broadcast(msg); break; } case MessageType.SendToGroup: { Clients.Group(msg.GroupName).receive(msg); // 指定客户端组,这个也是实现群聊的关键所在 break; } case MessageType.Throw: { throw new InvalidOperationException("Client does not receive this error"); } //break; default: { break; } } } public void PushTip(string orgId, string userId) { var sId = HubsTool.GetConnectionId(orgId, userId); if (sId != "") { Clients.Client(sId).pushtips(); } } public void PushTips(IList userIds) { var sIds = HubsTool.GetConnectionIds(userIds); if (sIds.Count > 0) { Clients.Clients(sIds).pushtips(); } } public void PushMsg(string orgId, string userId) { var sId = HubsTool.GetConnectionId(orgId, userId); if (sId != "") { Clients.Client(sId).pushmsgs(); } } public void PushMsgs(IList userIds) { var sIds = HubsTool.GetConnectionIds(userIds); if (sIds.Count > 0) { Clients.Clients(sIds).pushmsgs(); } } public void PushTransfer(string orgId, string userId, string data, int index) { var sTransferOrgID = Common.ConfigGetValue("", "TransferOrgID"); var sTransferUerID = Common.ConfigGetValue("", "TransferUerID"); var sId = HubsTool.GetConnectionId(sTransferOrgID, sTransferUerID); if (sId != "") { var sTransferData = ""; switch (index) { case 1://抓取要拋轉的賬單資料 { sTransferData = MsgHubService.GetBillsString(orgId, data); break; } case 2://抓取要拋轉的客戶資料 { sTransferData = MsgHubService.GetCustomersString(orgId, data); break; } case 3://抓取要拋轉的專案資料 { sTransferData = MsgHubService.GetExhibitionsString(orgId, data); break; } default: { break; } } if (sTransferData != "[]") { Clients.Client(sId).pushtransfer(orgId, userId, sTransferData, index); } } else { Clients.Caller.transfertips(); } } public void TransferBack(string data, int index) { switch (index) { case 1://賬單移除 { MsgHubService.RemoveBills(data); break; } case 2://客戶移除 { MsgHubService.RemoveCustomers(data); break; } case 3://專案移除 { MsgHubService.RemoveExhibitions(data); break; } default: { break; } } } public void ExistTrasfer(string data, string userId) { var bInstall = true; if (Euro_Online.Users.Count(x => x.UserId == userId) == 0) { bInstall = false; } Clients.Caller.existtrasfer(data, bInstall); } public void GetOnlineUsers() { var user = Euro_Online.Users.Find(u => u.ConnectionId == Context.ConnectionId); var sTransferOrgID = Common.ConfigGetValue("", "TransferOrgID"); var sTransferUerID = Common.ConfigGetValue("", "TransferUerID"); if (user != null) { if (user.UserId == sTransferUerID) { Clients.Caller.onlineusers(Euro_Online.Users); } else { var onlineUsers = Euro_Online.Users.Where(x => x.OrgId == user.OrgId).ToList(); var sIds = HubsTool.GetConnectionIdsByOrgID(user.OrgId); Clients.Clients(sIds).onlineusers(onlineUsers); } } } public void Hello() { Clients.All.hello(); } } }