yl
2022-11-26 5a10098b80f0d731e6a84f4ea3adc25ddfc74556
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
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
{
    /// <summary>
    /// chatHub集线器类
    /// </summary>
    [HubName("chatHub")]
    public class ChatHub : Hub
    {
        /// <summary>
        /// 静态用户列表
        /// </summary>
        private IList<string> userList = UserInfo.userList;
 
        /// <summary>
        /// 用户的connectionID与用户名对照表
        /// </summary>
        private readonly static Dictionary<string, string> _connections = new Dictionary<string, string>();
 
        /// <summary>
        /// 发送函数,前端触发该函数给服务器,服务器在将消息发送给前端,(Clients.All.(函数名)是全体广播,另外Clients提供了组播,广播排除,组播排除,指定用户播发等等)
        /// 该函数名在前端使用时一定要注意,前端调用该函数时,函数首字母一定要小写
        /// </summary>
        /// <param name="name1">发起者</param>
        /// <param name="name2">消息接收者</param>
        /// <param name="cont">消息内容</param>
        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<string>("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") + "的消息推送!");
        }
 
        /// <summary>
        /// 安灯呼叫提交时调用
        /// </summary>
        /// <param name="username">发起人</param>
        /// <param name="wkshpcode">车间编码</param>
        /// <param name="eqpcode">设备编码</param>
        /// <param name="json"></param>
        public void SendByGroupList(string username,string wkshpcode, string eqpcode, List<AnDnDate> 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;
            }
           
        }
 
 
        /// <summary>
        /// 用户上线函数(单用户)
        /// </summary>
        /// <param name="name">用户名</param>
        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);
        }
        /// <summary>
        /// 用户上线函数(多用户)
        /// </summary>
        /// <param name="code">用户名集合</param>
        public void SendLogins(string code)
        {
            string[] selects = Array.ConvertAll<string, string>(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<string> userList = new List<string>();
    }
}