ComplianceServer/oldcode/AppletMvcService/ChatHub.cs

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);
}
}
}