231 lines
9.8 KiB
C#
231 lines
9.8 KiB
C#
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);
|
|
//}
|
|
|
|
/// <summary>
|
|
/// 给客服发送消息
|
|
/// </summary>
|
|
/// <param name="toUserId"></param>
|
|
/// <param name="fromUserId"></param>
|
|
/// <param name="message"></param>
|
|
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<ChatHub>().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<ChatHub>().Clients.Client(xx.ConnectionId).receivePrivateMessage(fromUserId, message, msgType);
|
|
}
|
|
|
|
#region Data Members
|
|
private static Dictionary<string, List<UserDetail>> _connectedUsers;
|
|
|
|
public static Dictionary<string, List<UserDetail>> ConnectedUsers
|
|
{
|
|
get
|
|
{
|
|
if (_connectedUsers == null || _connectedUsers.Count == 0)
|
|
{
|
|
_connectedUsers = MessageHandler.GetConnectedByRedis();
|
|
}
|
|
return ChatHub._connectedUsers;
|
|
|
|
}
|
|
set { ChatHub._connectedUsers = value; }
|
|
}
|
|
//public static List<CustoemrDetail> CustomerUsers = new List<CustoemrDetail>();//客户在线列表
|
|
//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<ChatHub>().Clients.Client(xx.ConnectionId).getAlive(userId);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 登录连线
|
|
/// </summary>
|
|
/// <param name="userID">用户ID</param>
|
|
/// <param name="userName">用户名</param>
|
|
/// <param name="deptName">部门名</param>
|
|
/// <param name="accountnum">公众号</param>
|
|
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<UserDetail>());
|
|
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());
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 发送私聊
|
|
/// </summary>
|
|
/// <param name="toUserId">接收方用户连接ID</param>
|
|
/// <param name="message">内容</param>
|
|
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
|
|
//}
|
|
}
|
|
/// <summary>
|
|
/// 批量发送
|
|
/// </summary>
|
|
/// <param name="toUserIds">接收人openID用“,”隔开</param>
|
|
/// <param name="message">消息</param>
|
|
/// <param name="accountnum">公众号</param>
|
|
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);
|
|
}
|
|
}
|
|
///// <summary>
|
|
///// 发送素材消息
|
|
///// </summary>
|
|
///// <param name="toUserId">目标人</param>
|
|
///// <param name="name">素材名称</param>
|
|
///// <param name="media_id">素材ID</param>
|
|
///// <param name="sucaitype">素材类型</param>
|
|
///// <param name="url">素材地址</param>
|
|
///// <param name="accountnum">公众号</param>
|
|
//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);
|
|
// //}
|
|
// }
|
|
|
|
//}
|
|
/// <summary>
|
|
/// 离线
|
|
/// </summary>
|
|
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);
|
|
}
|
|
|
|
|
|
}
|
|
} |