yl
2022-12-02 14d02d9f9df720a568d8f08f2921e023642fc260
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
using Dapper;
using Microsoft.AspNet.SignalR;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Web;
using VueWebApi.Models;
using VueWebApi.Tools;
 
namespace VueWebApi.Hubs
{
    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)
        {
            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(); //匹配已经登录的推送人员唯一码
                var FindPublicBaseDicName = _connections.Where(d => FindPublicBaseDic.Contains(d.Value)).Select(x => x.Key).ToList(); //根据唯一码匹配已经登录的推送人员名称
                Clients.Clients(FindPublicBaseDic).SendMessage("来自用户:" + username +" 内容:" + cont + "时间" + DateTime.Now.ToString("yyyy/MM/ddhh:mm:ss") + "的消息通知!");
            }
        }
 
 
        /// <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;
            }
            //新用户上线,服务器广播该用户名
            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>();
    }
}