using Dapper; using Microsoft.AspNet.SignalR; using Microsoft.AspNet.SignalR.Hubs; using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Web; using VueWebApi.Models; using VueWebApi.Tools; namespace VueWebApi.Hubs { /// /// chatHub集线器类 /// [HubName("chatHub")] public class ChatHub : Hub { /// /// 静态用户列表 /// private IList userList = UserInfo.userList; /// /// 用户的connectionID与用户名对照表 /// private readonly static Dictionary _connections = new Dictionary(); /// /// 发送函数,前端触发该函数给服务器,服务器在将消息发送给前端,(Clients.All.(函数名)是全体广播,另外Clients提供了组播,广播排除,组播排除,指定用户播发等等) /// 该函数名在前端使用时一定要注意,前端调用该函数时,函数首字母一定要小写 /// /// 发起者 /// 消息接收者 /// 消息内容 public void SendByGroup(string name1, string name2, string cont) { LogHelper.WriteLogData("登录人员:" + name1 + "发送人:" + name2 + "发送内容:" + cont); //Client内为用户的id,是唯一的,SendMessage函数是前端函数,意思是服务器将该消息推送至前端 //Clients.Client(_connections[name2]).SendMessage("来自用户:" + name1 + " 内容:" + cont + "" + DateTime.Now.ToString("yyyy/MM/ddhh:mm:ss") + "的消息推送!"); Clients.Client(_connections[name2]).SendMessage("来自用户:" + name1 + " 内容:" + cont + "" + DateTime.Now.ToString("yyyy/MM/ddhh:mm:ss") + "的消息推送!"); } public void SendByGroups(string name1, DataTable name2, string cont) { var departmentIDs = name2.AsEnumerable().ToList().Select(x => x.Field("name")).ToList(); var FindPublicBaseDic = _connections.Where(d => departmentIDs.Contains(d.Key)).Select(x => x.Value).ToList(); Clients.Clients(FindPublicBaseDic).SendMessage("来自用户:" + name1 + " 内容:" + cont + "" + DateTime.Now.ToString("yyyy/MM/ddhh:mm:ss") + "的消息推送!"); } /// /// 安灯呼叫提交时调用 /// /// 发起人 /// 车间编码 /// 设备编码 /// public void SendByGroupList(string username,string wkshpcode, string eqpcode, List json) { try { for (int i = 0; i < json.Count; i++) { string cont = wkshpcode + "对应设备" + eqpcode + json[i].name.ToString(); var departmentIDs = json[i].children.ToList().Select(x => x.username).ToList();//获取推送人员 var FindPublicBaseDic = _connections.Where(d => departmentIDs.Contains(d.Key)).Select(x => x.Value).ToList(); //匹配已经登录的推送人员唯一码 LogHelper.WriteLogData("在线人数:"+FindPublicBaseDic.Count.ToString()); var FindPublicBaseDicName = _connections.Where(d => FindPublicBaseDic.Contains(d.Value)).Select(x => x.Key).ToList(); //根据唯一码匹配已经登录的推送人员名称 LogHelper.WriteLogData("在线人人员名称:" + FindPublicBaseDicName.ToString()); Clients.Clients(FindPublicBaseDic).SendMessage("来自用户:" + username + " 内容:" + cont + "时间" + DateTime.Now.ToString("yyyy/MM/ddhh:mm:ss") + "的消息通知!"); } } catch (Exception ex) { LogHelper.WriteLogData("报错:"+ex.Message); throw; } } /// /// 用户上线函数(单用户) /// /// 用户名 public void SendLogin(string name) { //LogHelper.WriteLogData("登录人员:" + name); if (!userList.Contains(name)) { userList.Add(name); //这里便是将用户id和姓名联系起来 _connections.Add(name, Context.ConnectionId); } else { //每次登陆id会发生变化 _connections[name] = Context.ConnectionId; LogHelper.WriteLogData("执行关联:-->" + _connections[name]); } //新用户上线,服务器广播该用户名 Clients.All.loginUser(userList); } /// /// 用户上线函数(多用户) /// /// 用户名集合 public void SendLogins(string code) { string[] selects = Array.ConvertAll(code.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries), s => s.ToString()); //string分割转string[] //查找系统用户 var sql = @"select usercode as code,username as name from TUser where is_delete='0' and enable='Y' and usercode in @usercode"; var data = DapperHelper.selectlist(sql, new { shopcode = selects.ToArray() }); for (int i = 0; i < data.Rows.Count; i++) { if (!userList.Contains(data.Rows[i]["name"].ToString())) { userList.Add(data.Rows[i]["name"].ToString()); //这里便是将用户id和姓名联系起来 _connections.Add(data.Rows[i]["name"].ToString(), Context.ConnectionId); } else { //每次登陆id会发生变化 _connections[data.Rows[i]["name"].ToString()] = Context.ConnectionId; } } //新用户上线,服务器广播该用户名 Clients.All.loginUser(userList); } } public class UserInfo { public static IList userList = new List(); } }