| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987 |
-
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Configuration;
- using SuperSocket.SocketBase;
- using SuperWebSocket;
- using SuperSocket.SocketBase.Config;
- using Newtonsoft.Json;
- using Newtonsoft.Json.Linq;
- using System.Threading;
- namespace CallCenter.WebChatServer
- {
- public class ChatServer
- {
- WebSocketServer server = new WebSocketServer();
- public ChatSql cs = new ChatSql();
- public List<ChatClass.Servicer> Servicers = new List<ChatClass.Servicer>();
- public List<ChatClass.Customer> Customers = new List<ChatClass.Customer>();
- private List<ChatSql.T_Chat_Message> Messages = new List<ChatSql.T_Chat_Message>();
- public ChatServer()
- {
- }
- #region 服务初始化管理
- /// <summary>
- /// 初始化服务
- /// </summary>
- /// <returns></returns>
- public bool Setup()
- {
- ServerConfig serverConfig = new ServerConfig
- {
- Ip = ConfigurationManager.AppSettings["ip"],
- Port = Int32.Parse(ConfigurationManager.AppSettings["port"]),//set the listening port
- MaxConnectionNumber = Int32.Parse(ConfigurationManager.AppSettings["maxnumber"])
- };
- //WebSocket服务器端启动
- if (!server.Setup(serverConfig))
- {
- server.Logger.Error("WebSocket服务器端启动失败");
- //处理启动失败消息
- return false;
- }
- //新的会话连接时
- server.NewSessionConnected += server_NewSessionConnected;
- //会话关闭
- server.SessionClosed += server_SessionClosed;
- //接收到新的消息时
- server.NewMessageReceived += server_NewMessageReceived;
- return true;
- }
- /// <summary>
- /// 开启服务
- /// </summary>
- /// <returns></returns>
- public int Start()
- {
- if (server.State == ServerState.NotStarted)
- {
- if (!server.Start())
- {
- server.Logger.Error(string.Format("开启WebSocket服务侦听失败:{0}:{1}", server.Config.Ip, server.Config.Port));
- //处理监听失败消息
- return 3;
- }
- }
- else
- {
- return 2;
- }
- return 1;
- }
- /// <summary>
- /// 关闭服务
- /// </summary>
- /// <returns></returns>
- public int Stop()
- {
- if (server.State == ServerState.Running)
- {
- server.Stop();
- }
- else
- {
- return 2;
- }
- return 1;
- }
- /// <summary>
- /// 获取服务状态
- /// </summary>
- /// <returns></returns>
- public ServerState State()
- {
- return server.State;
- }
- #endregion
- /// <summary>
- /// 接收到消息
- /// </summary>
- /// <param name="session"></param>
- /// <param name="value"></param>
- private void server_NewMessageReceived(WebSocketSession session, string value)
- {
- try
- {
- var ip = session.RemoteEndPoint.Address.ToString();
- ChatClass.Message msg = JsonConvert.DeserializeObject<ChatClass.Message>(value);
- msg.state = 1;
- msg.humanclass = 0;
- switch (msg.action.ToLower())
- {
- case "cusconn":
- #region 客户连接
- if (!cs.IsBlack(ip))
- {
- ChatClass.Customer cus = new ChatClass.Customer();
- //添加到客户组
- string code = msg.code;
- if (string.IsNullOrEmpty(code))//为空是网站,不为空是微信
- {
- code = cs.GetCode();
- }
- msg.code = code;
- var cusconn = Customers.Where(p => p.Code == code).FirstOrDefault();
- if (cusconn == null)
- {
- var cususer = cs.GetCusUser(code);//获取是否存在此客户
- if (cususer == null)
- {
- ChatSql.T_Chat_User user = new ChatSql.T_Chat_User();
- user.F_OpenId = code;
- user.F_Account = code;
- user.F_Type = 1;
- user.F_State = 0;
- user.F_IsDelete = 0;
- user.F_CreateTime = DateTime.Now;
- user.F_Id = cs.AddUser(user);
- cususer = user;
- }
- if (string.IsNullOrEmpty(cususer.F_Name))
- {
- cususer.F_Name = ConfigurationManager.AppSettings["anyname"];
- }
- if (string.IsNullOrEmpty(cususer.F_IP))
- {
- cususer.F_IP = ip;
- }
- cs.UpdateUser(cususer);
- cus.Name = cususer.F_Name;
- cus.HeadImgUrl = cususer.F_HeadImgUrl;
- msg.name = cus.Name;
- msg.headimgurl = cus.HeadImgUrl;
- cus.SessionID = session.SessionID;
- cus.Code = code;
- cus.IsSend = 0;
- //if (Servicers.Count <= 0)
- //{
- // ChatClass.Message newmsg = new ChatClass.Message();
- // newmsg.action = "ServicersAllOff";
- // newmsg.msg = ConfigurationManager.AppSettings["busy"];
- // session.Send(JsonConvert.SerializeObject(newmsg));//向客户发送客服不在线
- //}
- if (Servicers.Count > 0)
- {
- // 分配客户给客服
- cus.ServicerSessionID = SplitCustomer(cus);
- }
- ChatSql.T_Chat_IPList ipmodel = new ChatSql.T_Chat_IPList();
- ipmodel = cs.GetIPInfo(ip, code);
- if (ipmodel == null)
- {
- #region ip记录
- ipmodel = new ChatSql.T_Chat_IPList();
- //string ipinfojson = ChatCommon.HttpGet(ConfigurationManager.AppSettings["ipurl"] + "?ip=" + ip);
- //var ipinfos = JsonConvert.DeserializeObject<JObject>(ipinfojson);
- //var ipinfo = JsonConvert.DeserializeObject<JObject>(ipinfos["data"].ToString());
- ipmodel.F_IP = ip;
- ipmodel.F_OpenId = cus.Code;
- ipmodel.F_Type = 2;
- //ipmodel.F_Country = ipinfo["country"].ToString();
- //ipmodel.F_CountryCode = ipinfo["country_id"].ToString();
- //ipmodel.F_Area = ipinfo["area"].ToString();
- //ipmodel.F_AreaCode = ipinfo["area_id"].ToString();
- //ipmodel.F_Region = ipinfo["region"].ToString();
- //ipmodel.F_RegionCode = ipinfo["region_id"].ToString();
- //ipmodel.F_City = ipinfo["city"].ToString();
- //ipmodel.F_CityCode = ipinfo["city_id"].ToString();
- //ipmodel.F_County = ipinfo["county"].ToString();
- //ipmodel.F_CountyCode = ipinfo["county_id"].ToString();
- //ipmodel.F_ISP = ipinfo["isp"].ToString();
- //ipmodel.F_ISPCode = ipinfo["isp_id"].ToString();
- ipmodel.F_CreateTime = DateTime.Now;
- cs.AddIP(ipmodel);
- #endregion
- }
- msg.data = ipmodel;
- #region 签入时间
- ChatSql.T_Chat_InOut inoutmodel = new ChatSql.T_Chat_InOut();
- inoutmodel.F_OpenId = cus.Code;
- inoutmodel.F_IP = ip;
- inoutmodel.F_Type = 2;
- inoutmodel.F_InTime = DateTime.Now;
- cs.AddInOut(inoutmodel);
- #endregion
- cus.IPData = ipmodel;
- Customers.Add(cus);//将客户新增到在线客户列表
- ChatClass.Message serntcmsg = new ChatClass.Message();
- serntcmsg.action = "serreceive";
- serntcmsg.msg = cus.Name + " 上线";
- serntcmsg.code = cus.Code;
- serntcmsg.name = cus.Name;
- //serntcmsg.humanclass = 0;
- serntcmsg.data = ipmodel;
- serntcmsg.state = 0;
- SendMsgToRemotePoint(cus.ServicerSessionID, serntcmsg);
- #region 发送消息到 - 欢迎词 IM
- bool b_cus = false;
- int maxTime = int.Parse(ConfigurationManager.AppSettings["welcome_maxtime"]);
- string welcome = ConfigurationManager.AppSettings["welcome"];
- string MaxDate = cs.GetMessageDateByCode(cus.Code);
- DateTime NowDate = DateTime.Now;
- if (string.IsNullOrEmpty(MaxDate))
- b_cus = true;
- else
- b_cus = (Convert.ToDateTime(MaxDate)).AddSeconds(maxTime) < NowDate;
- if (b_cus)
- {
- var sersend = Servicers.Where(p => p.SessionID == cus.ServicerSessionID).FirstOrDefault();
- // 欢迎词2
- string welcome_Content = cs.GetWebcomeByGroupId(2);
- //serntcmsg.action = "cusreceive";
- //serntcmsg.msg = "你好,有什么可以帮你的吗?";
- //serntcmsg.code = sersend.Code; // sersend != null ? sersend.Code : "";
- //serntcmsg.name = sersend.Name; // sersend != null ? sersend.Name : "";
- //serntcmsg.headimgurl = sersend != null ? sersend.HeadImgUrl : "";
- //serntcmsg.data = "";
- //serntcmsg.state = 0;
- //SendMsgToRemotePoint(cus.SessionID, serntcmsg);
- ChatSql.T_Chat_Message sermsg = new ChatSql.T_Chat_Message();
- sermsg.F_FromUser = sersend == null ? "" : sersend.Code;
- sermsg.F_ToUser = cus.Code;
- sermsg.F_Message = string.IsNullOrEmpty(welcome_Content) ? welcome : welcome_Content; //"你好,有什么可以帮你的吗?";
- sermsg.F_HumanClass = 3;
- sermsg.F_IP = ip;
- sermsg.F_SourceType = 1;
- sermsg.F_MessageType = 1;
- sermsg.F_State = 0;
- sermsg.F_IsDelete = 0;
- sermsg.F_CreateTime = DateTime.Now;
- sermsg.F_CreateUser = sersend == null ? "" : sersend.Code;
- cs.AddMsg(sermsg);
- }
- #endregion
- }
- else
- {
- msg.code = "";
- msg.state = 0;
- msg.msg = "请不要打开多个聊天窗口";
- }
- }
- else
- {
- msg.state = 0;
- msg.msg = ConfigurationManager.AppSettings["black"];
- }
- #endregion
- break;
- case "cussend":
- #region 客户发送消息
- if (!cs.IsBlack(ip))
- {
- var cussend = Customers.Where(p => p.SessionID == session.SessionID).FirstOrDefault();
- //var serreceive = new ChatClass.Servicer();
- if (cussend != null)
- {
- #region 客服发送消息 - 智能机器人IM(客服在线和不在线都要发送和保存)1
- msg.time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
- msg.humanclass = 2;
- session.Send(JsonConvert.SerializeObject(msg));
- #region 客服不在线是发送
- ChatSql.T_Chat_Message cusmsg = new ChatSql.T_Chat_Message();
- cusmsg.F_FromUser = cussend.Code; //msg.code
- //cusmsg.F_ToUser = "";
- cusmsg.F_Message = msg.msg; // "智能机器人IM,能查到很多信息"
- cusmsg.F_HumanClass = 2;
- cusmsg.F_IP = ip;
- cusmsg.F_HumanClass = 2;
- cusmsg.F_SourceType = 1;
- cusmsg.F_MessageType = 1;
- cusmsg.F_State = 0;
- cusmsg.F_IsDelete = 0;
- cusmsg.F_CreateTime = DateTime.Now;
- cusmsg.F_CreateUser = msg.code;
- //cs.AddMsg(cusmsg);
- #endregion
- #endregion
- if (Servicers.Count <= 0)
- {
- cussend.IsSend = 1;
- //msg.state = 0;
- //msg.msg = ConfigurationManager.AppSettings["busy"];
- #region 发送消息->客户 - 智能机器人IM(客服都不在线时发送)
- cusmsg.F_ToUser = ""; //客服都不在线
- cs.AddMsg(cusmsg);
- // 客服不在线时,启动 智能机器人IM
- string strContent = cs.GetSmartRobotByKey(msg.msg);
- if (string.IsNullOrEmpty(strContent))
- strContent = ConfigurationManager.AppSettings["busy_robotreply"];
- Thread.Sleep(500);
- ChatClass.Message cusrecmsg = new ChatClass.Message();
- cusrecmsg.action = "cusreceive";
- cusrecmsg.msg = strContent; // "智能机器人IM,能查到很多信息"
- cusrecmsg.humanclass = 3;
- cusrecmsg.code = cussend.Code;
- cusrecmsg.name = cussend.Name;
- cusrecmsg.headimgurl = cussend.HeadImgUrl;
- cusrecmsg.state = 0;
- if (SendMsgToRemotePoint(cussend.SessionID, cusrecmsg))
- {
- ChatSql.T_Chat_Message sermsg = new ChatSql.T_Chat_Message();
- sermsg.F_FromUser = ""; // serreceive.Code;
- sermsg.F_ToUser = cussend.Code;
- sermsg.F_Message = strContent; // "智能机器人IM,能查到很多信息"
- sermsg.F_HumanClass = 3;
- sermsg.F_IP = ip;
- sermsg.F_SourceType = 1;
- sermsg.F_MessageType = 1;
- sermsg.F_State = 0;
- sermsg.F_IsDelete = 0;
- sermsg.F_CreateTime = DateTime.Now;
- sermsg.F_CreateUser = cussend.Code;
- cs.AddMsg(sermsg);
- }
- #endregion
- }
- else
- {
- if (string.IsNullOrEmpty(cussend.ServicerSessionID))
- {
- // 分配客户给客服
- cussend.ServicerSessionID = SplitCustomer(cussend);
- }
- ChatClass.Message serrecmsg = new ChatClass.Message();
- serrecmsg.action = "serreceive";
- serrecmsg.msg = msg.msg;
- serrecmsg.code = cussend.Code;
- serrecmsg.name = cussend.Name;
- serrecmsg.headimgurl = cussend.HeadImgUrl;
- serrecmsg.humanclass = 2;
- serrecmsg.state = 1;
- if (SendMsgToRemotePoint(cussend.ServicerSessionID, serrecmsg))
- {
- var serreceive = Servicers.Where(p => p.SessionID == cussend.ServicerSessionID).FirstOrDefault();
- cusmsg.F_ToUser = serreceive.Code; //客服都在线
- cs.AddMsg(cusmsg);
- //ChatSql.T_Chat_Message cusmsg = new ChatSql.T_Chat_Message();
- //cusmsg.F_FromUser = cussend.Code;
- //cusmsg.F_ToUser = serreceive.Code;
- //cusmsg.F_Message = msg.msg;
- //cusmsg.F_IP = ip;
- //cusmsg.F_SourceType = 1;
- //cusmsg.F_MessageType = 1;
- //cusmsg.F_State = 0;
- //cusmsg.F_IsDelete = 0;
- //cusmsg.F_CreateTime = DateTime.Now;
- //cusmsg.F_CreateUser = serreceive.Code;
- //cs.AddMsg(cusmsg);
- }
- else
- {
- //ChatClass.Message newmsg = new ChatClass.Message();
- //newmsg.action = "CusSendError";
- //newmsg.msg = "发送失败";
- //session.Send(JsonConvert.SerializeObject(newmsg));
- msg.state = 0;
- msg.msg = "发送失败";
- }
-
- }
- }
- else
- {
- msg.state = 0;
- msg.msg = "发送失败";
- }
- }
- else
- {
- msg.state = 0;
- msg.msg = ConfigurationManager.AppSettings["black"];
- }
- #endregion
- break;
- case "loglist":
- #region 聊天记录
- int count = Int32.Parse(ConfigurationManager.AppSettings["pagenumer"]);
- long num = 0;
- long.TryParse(msg.msg, out num);
- int isfirst = 0;
- var dt = cs.GetChatLog(msg.code, out num, out isfirst, count, num);
- var obj = new
- {
- rows = dt,
- num = num,
- isfirst = isfirst
- };
- msg.data = obj;
- #endregion
- break;
- case "serconn":
- #region 客服连接
- var serconn = Servicers.Where(p => p.Code == msg.code).FirstOrDefault();
- if (serconn == null)
- {
- ChatClass.Servicer svc = new ChatClass.Servicer();
- svc.SessionID = session.SessionID;
- svc.Code = msg.code;
- svc.Name = cs.GetUserName(msg.code);
- svc.Count = 0;
- svc.State = 1;
- Servicers.Add(svc);
- session.Send(JsonConvert.SerializeObject(msg));
- if (Servicers.Count == 1)
- {
- foreach (var cuson in Customers)
- {
- cuson.ServicerSessionID= session.SessionID;
- ChatClass.Message newmsg = new ChatClass.Message();
- newmsg.action = "serreceive";
- newmsg.msg = cuson.Name + " 上线";
- newmsg.code = cuson.Code;
- newmsg.name = cuson.Name;
- newmsg.data = cuson.IPData;
- newmsg.state = 0;
- SendMsgToRemotePoint(session.SessionID, newmsg);//向客服发送客户上线通知
- }
- }
- if (!cs.IsExitIP(ip, msg.code))
- {
- #region IP记录
- //string ipinfojson = ChatCommon.HttpGet(ConfigurationManager.AppSettings["ipurl"] + "?ip=" + ip);
- //var ipinfos = JsonConvert.DeserializeObject<JObject>(ipinfojson);
- //var ipinfo = JsonConvert.DeserializeObject<JObject>(ipinfos["data"].ToString());
- ChatSql.T_Chat_IPList ipmodel = new ChatSql.T_Chat_IPList();
- ipmodel.F_IP = ip;
- ipmodel.F_OpenId = msg.code;
- ipmodel.F_Type = 1;
- //ipmodel.F_Country = ipinfo["country"].ToString();
- //ipmodel.F_CountryCode = ipinfo["country_id"].ToString();
- //ipmodel.F_Area = ipinfo["area"].ToString();
- //ipmodel.F_AreaCode = ipinfo["area_id"].ToString();
- //ipmodel.F_Region = ipinfo["region"].ToString();
- //ipmodel.F_RegionCode = ipinfo["region_id"].ToString();
- //ipmodel.F_City = ipinfo["city"].ToString();
- //ipmodel.F_CityCode = ipinfo["city_id"].ToString();
- //ipmodel.F_County = ipinfo["county"].ToString();
- //ipmodel.F_CountyCode = ipinfo["county_id"].ToString();
- //ipmodel.F_ISP = ipinfo["isp"].ToString();
- //ipmodel.F_ISPCode = ipinfo["isp_id"].ToString();
- ipmodel.F_CreateTime = DateTime.Now;
- cs.AddIP(ipmodel);
- #endregion
- }
- #region 签入时间
- ChatSql.T_Chat_InOut inoutmodel = new ChatSql.T_Chat_InOut();
- inoutmodel.F_OpenId = msg.code;
- inoutmodel.F_IP = ip;
- inoutmodel.F_Type = 1;
- inoutmodel.F_InTime = DateTime.Now;
- cs.AddInOut(inoutmodel);
- #endregion
- }
- else
- {
- //ChatClass.Message newmsg = new ChatClass.Message();
- //newmsg.action = "SerConnError";
- //newmsg.msg = "此工号已经存在";
- //session.Send(JsonConvert.SerializeObject(newmsg));
- msg.state = 0;
- msg.msg = "此工号已经存在";
- session.Send(JsonConvert.SerializeObject(msg));
- }
- #endregion
- break;
- case "sersend":
- #region 客服发送消息
- var cusreceive = Customers.Where(p => p.Code == msg.code).FirstOrDefault();
- if (cusreceive != null)
- {
- var sersend = Servicers.Where(p => p.SessionID == session.SessionID).FirstOrDefault();
- ChatClass.Message recmsg = new ChatClass.Message();
- recmsg.action = "cusreceive";
- recmsg.msg = msg.msg;
- recmsg.code = sersend.Code;
- recmsg.name = sersend.Name;
- recmsg.headimgurl = sersend.HeadImgUrl;
- recmsg.humanclass = 1;
- if (SendMsgToRemotePoint(cusreceive.SessionID, recmsg))
- {
- ChatSql.T_Chat_Message sermsg = new ChatSql.T_Chat_Message();
- sermsg.F_FromUser = sersend.Code;
- sermsg.F_ToUser = cusreceive.Code;
- sermsg.F_Message = msg.msg;
- sermsg.F_HumanClass = 1;
- sermsg.F_IP = ip;
- sermsg.F_SourceType = 1;
- sermsg.F_MessageType = 1;
- sermsg.F_State = 0;
- sermsg.F_IsDelete = 0;
- sermsg.F_CreateTime = DateTime.Now;
- sermsg.F_CreateUser = sersend.Code;
- cs.AddMsg(sermsg);
- #region 发送消息到 - 智能机器人IM
- //ChatClass.Message cusrecmsg = new ChatClass.Message();
- //cusrecmsg.action = "cusreceive";
- //cusrecmsg.msg = "智能机器人IM,能查到很多信息222";
- //cusrecmsg.code = sersend.Code;
- //cusrecmsg.name = sersend.Name;
- //cusrecmsg.headimgurl = sersend.HeadImgUrl;
- //cusrecmsg.state = 0;
- //if (SendMsgToRemotePoint(cusreceive.SessionID, cusrecmsg))
- //{
- // //var cussend = Customers.Where(p => p.SessionID == cussend.SessionID).FirstOrDefault();
- // ChatSql.T_Chat_Message sermsg1 = new ChatSql.T_Chat_Message();
- // sermsg1.F_FromUser = sersend.Code;
- // sermsg1.F_ToUser = cusreceive.Code;
- // sermsg1.F_Message = "智能机器人IM,能查到很多信息222";
- // sermsg1.F_IP = ip;
- // sermsg1.F_SourceType = 1;
- // sermsg1.F_MessageType = 1;
- // sermsg1.F_State = 0;
- // sermsg1.F_IsDelete = 0;
- // sermsg1.F_CreateTime = DateTime.Now;
- // sermsg1.F_CreateUser = sersend.Code;
- // cs.AddMsg(sermsg);
- //}
- #endregion
- }
- else
- {
- //ChatClass.Message newmsg = new ChatClass.Message();
- //newmsg.action = "SerSendError";
- //newmsg.msg = "发送失败";
- //session.Send(JsonConvert.SerializeObject(newmsg));
- msg.state = 0;
- msg.msg = "发送失败";
- }
- }
- else
- {
- //ChatClass.Message newmsg = new ChatClass.Message();
- //newmsg.action = "SerSendError";
- //newmsg.msg = "客户已下线";
- //session.Send(JsonConvert.SerializeObject(newmsg));
- msg.state = 0;
- msg.msg = "客户已下线";
- }
- #endregion
- break;
- case "cusmass":
- #region 群发客户
- var cusss = Customers;
- if (!string.IsNullOrEmpty(msg.code))
- {
- cusss = Customers.Where(p => msg.code.Split(',').Contains(p.Code)).ToList();
- }
- foreach (var cuss in cusss)
- {
- ChatClass.Message recmsg = new ChatClass.Message();
- recmsg.action = "cusreceive";
- recmsg.msg = msg.msg;
- recmsg.code = cuss.Code;
- recmsg.name = cuss.Name;
- recmsg.headimgurl = cuss.HeadImgUrl;
- recmsg.humanclass = 1;
- recmsg.state = 0;
- if (SendMsgToRemotePoint(cuss.SessionID, recmsg))
- {
- //ChatSql.T_Chat_Message sermsg = new ChatSql.T_Chat_Message();
- //sermsg.F_FromUser = msg.code;
- //sermsg.F_ToUser = cuss.Code;
- //sermsg.F_Message = msg.msg;
- //sermsg.F_IP = session.RemoteEndPoint.Address.ToString();
- //sermsg.F_SourceType = 1;
- //sermsg.F_MessageType = 1;
- //sermsg.F_State = 0;
- //sermsg.F_IsDelete = 0;
- //sermsg.F_CreateTime = DateTime.Now;
- //sermsg.F_CreateUser = msg.code;
- //cs.AddMsg(sermsg);
- }
- }
- #endregion
- break;
- case "sermass":
- #region 群发客服
- var serss = Servicers;
- if (!string.IsNullOrEmpty(msg.code))
- {
- serss = Servicers.Where(p => msg.code.Split(',').Contains(p.Code)).ToList();
- }
- foreach (var sers in serss)
- {
- ChatClass.Message recmsg = new ChatClass.Message();
- recmsg.action = "serreceive";
- recmsg.msg = msg.msg;
- recmsg.code = sers.Code;
- recmsg.name = sers.Name;
- recmsg.headimgurl = sers.HeadImgUrl;
- recmsg.humanclass = 2;
- recmsg.state = 0;
- if (SendMsgToRemotePoint(sers.SessionID, recmsg))
- {
- //ChatSql.T_Chat_Message sermsg = new ChatSql.T_Chat_Message();
- //sermsg.F_FromUser = msg.code;
- //sermsg.F_ToUser = sers.Code;
- //sermsg.F_Message = msg.msg;
- //sermsg.F_IP = session.RemoteEndPoint.Address.ToString();
- //sermsg.F_SourceType = 1;
- //sermsg.F_MessageType = 1;
- //sermsg.F_State = 0;
- //sermsg.F_IsDelete = 0;
- //sermsg.F_CreateTime = DateTime.Now;
- //sermsg.F_CreateUser = msg.code;
- //cs.AddMsg(sermsg);
- }
- }
- #endregion
- break;
- case "custran":
- #region 转移客户
- var scus = Customers.Where(p => p.Code == msg.code).FirstOrDefault();
- var tser = Servicers.Where(p => p.Code == msg.data.ToString()).FirstOrDefault();
- if (scus == null)
- {
- msg.state = 0;
- msg.msg = "客户已下线,不能转移";
- }
- if (tser == null)
- {
- msg.state = 0;
- msg.msg = "客服已下线,不能转移";
- }
- if (tser.State == 0)
- {
- msg.state = 0;
- msg.msg = "客服已置忙,不能转移";
- }
- if (scus != null && tser != null && tser.State == 1)
- {
- var yser = Servicers.Where(p => p.SessionID==session.SessionID).FirstOrDefault();
- scus.ServicerSessionID = tser.SessionID;
- yser.Count = yser.Count - 1;
- tser.Count = tser.Count + 1;
- ChatClass.Message newmsg = new ChatClass.Message();
- newmsg.action = "serreceive";
- newmsg.msg = yser.Name + " 转移给你 " + scus.Name;
- newmsg.code = scus.Code;
- newmsg.name = scus.Name;
- newmsg.humanclass = 2;
- newmsg.state = 0;
- SendMsgToRemotePoint(scus.ServicerSessionID, newmsg);//向客服发送客户转移通知
- }
- #endregion
- break;
- case "serbusy"://客服置忙
- Servicers.Where(p => p.Code == msg.code).FirstOrDefault().State = 0;
- break;
- case "serfree"://客服置闲
- Servicers.Where(p => p.Code == msg.code).FirstOrDefault().State = 1;
- break;
- case "cuslist"://当前在线客户
- msg.data = Customers;
- break;
- case "serlist"://当前在线客服
- msg.data = Servicers;
- break;
- }
- if (msg.action.ToLower() != "serconn" && msg.action.ToLower() != "cussend")
- {
- msg.time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
- session.Send(JsonConvert.SerializeObject(msg));
- }
- }
- catch(Exception ex)
- {
- try
- {
- ChatClass.Message msg = JsonConvert.DeserializeObject<ChatClass.Message>(value);
- msg.state = 0;
- msg.msg = "操作失败:"+ ex.Message;
- msg.time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
- session.Send(JsonConvert.SerializeObject(msg));
- }
- catch
- {
- session.Send(value);
- }
- }
- }
- /// <summary>
- /// 会话关闭
- /// </summary>
- /// <param name="session"></param>
- /// <param name="value"></param>
- private void server_SessionClosed(WebSocketSession session, SuperSocket.SocketBase.CloseReason value)
- {
- var ses = Customers.Where(p => p.SessionID == session.SessionID).FirstOrDefault();
- if (ses != null)
- {
- Customers.Remove(ses);
- //Customers = Customers.Where(p => p.SessionID != session.SessionID).ToList();
- ChatClass.Message msg = new ChatClass.Message();
- msg.action = "serreceive";
- msg.code = ses.Code;
- msg.name = ses.Name;
- msg.state = 0;
- msg.msg = ses.Name+" 下线";
- //msg.humanclass = 0;
- SendMsgToRemotePoint(ses.ServicerSessionID, msg);
- cs.UpdateOutTime(ses.Code);
- }
- else
- {
- var ses1 = Servicers.Where(p => p.SessionID == session.SessionID).FirstOrDefault();
- if (ses1 != null)
- {
- Servicers.Remove(ses1);
- Servicers = Servicers.Where(p => p.SessionID != session.SessionID).ToList();
- int sercon = Servicers.Count;
- var cuss = Customers.Where(p => p.ServicerSessionID == session.SessionID);
- foreach (var cus in cuss)
- {
- if (sercon > 0)
- {
- cus.ServicerSessionID = SplitCustomer(cus);
- ChatClass.Message newmsg = new ChatClass.Message();
- newmsg.action = "serreceive";
- newmsg.msg = ses1.Name + " 下线," + cus.Name + " 转移给你";
- newmsg.code = cus.Code;
- newmsg.name = cus.Name;
- //newmsg.humanclass = 0;
- newmsg.state = 0;
- SendMsgToRemotePoint(cus.ServicerSessionID, newmsg);//向客服发送客户转移通知
- }
- else
- {
- cus.ServicerSessionID = "";
- }
- }
- cs.UpdateOutTime(ses1.Code);
- }
- }
- server.Logger.Info(string.Format("会话关闭,关闭原因:{0} 来自:{1} SessionID:{2} 时间:{3:HH:MM:ss}", value, session.RemoteEndPoint, session.SessionID, DateTime.Now));
- }
- /// <summary>
- /// 新的会话链接
- /// </summary>
- /// <param name="session"></param>
- private void server_NewSessionConnected(WebSocketSession session)
- {
- server.Logger.Info(string.Format("新的会话连接 来自:{0} SessionID:{1} 时间:{2:HH:MM:ss}", session.RemoteEndPoint, session.SessionID, DateTime.Now));
- }
- /// <summary>
- /// 发送消息到
- /// </summary>
- /// <param name="sessionId"></param>
- /// <param name="msg"></param>
- private bool SendMsgToRemotePoint(string sessionId, ChatClass.Message newmsg)
- {
- newmsg.time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
- string msg = JsonConvert.SerializeObject(newmsg);
- bool bl = false;
- var selsession = server.GetSessionByID(sessionId);
- if (selsession != null)
- {
- selsession.Send(msg);
- bl = true;
- }
- return bl;
- }
- /// <summary>
- /// 发送消息到客户
- /// </summary>
- /// <param name="codes">为空全部发送,多个用逗号隔开</param>
- /// <param name="msg"></param>
- private void SendMsgToCustomer(string codes, ChatClass.Message newmsg)
- {
- newmsg.time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
- string msg = JsonConvert.SerializeObject(newmsg);
- var cuss = Customers;
- if (!string.IsNullOrEmpty(codes))
- {
- cuss = Customers.Where(p => codes.Split(',').Contains(p.Code)).ToList();
- }
- foreach (var cus in cuss)
- {
- var selsession = server.GetSessionByID(cus.SessionID);
- if (selsession != null)
- {
- selsession.Send(msg);
- }
- }
- }
- /// <summary>
- /// 发送消息到客服
- /// </summary>
- /// <param name="codes">为空全部发送,多个用逗号隔开</param>
- /// <param name="msg"></param>
- private void SendMsgToServicer(string codes, ChatClass.Message newmsg)
- {
- newmsg.time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
- string msg = JsonConvert.SerializeObject(newmsg);
- var sers = Servicers;
- if (!string.IsNullOrEmpty(codes))
- {
- sers = Servicers.Where(p => codes.Split(',').Contains(p.Code)).ToList();
- }
- foreach (var ser in sers)
- {
- var selsession = server.GetSessionByID(ser.SessionID);
- if (selsession != null)
- {
- selsession.Send(msg);
- }
- }
- }
- /// <summary>
- /// 分配客户给客服
- /// </summary>
- /// <param name="cussend"></param>
- /// <returns></returns>
- private string SplitCustomer(ChatClass.Customer cussend)
- {
- var cususer = cs.GetCusUser(cussend.Code);//获取是否存在此客户
- ChatClass.Servicer SerFirst = Servicers.Where(p => p.State == 1).OrderBy(p => p.Count).FirstOrDefault();//获取当前在线客服的用户量最少的一个
- if (string.IsNullOrEmpty(cususer.F_MainUserCode))
- {
- cususer.F_MainUserCode = SerFirst.Code;
- cs.UpdateUser(cususer);//此次负责的客服更新到主要负责客服里面
- }
- else
- {
- var mser = Servicers.Where(p => p.Code == cususer.F_MainUserCode && p.State==1).FirstOrDefault();//获取此客户的主要负责客服是否在线
- if (mser != null)
- {
- SerFirst = mser;
- }
- else//主要负责客服不在线
- {
- var oser = Servicers.Where(p => cususer.F_OtherUserCode.Split(',').Contains(p.Code) && p.State == 1).FirstOrDefault();//获取此客户的次要负责客服是否在线
- if (oser != null)
- {
- SerFirst = mser;
- }
- else//次要负责客服不在线
- {
- string ouc = cususer.F_OtherUserCode;
- if (string.IsNullOrEmpty(ouc))
- {
- cususer.F_OtherUserCode = ouc;
- }
- else
- {
- cususer.F_OtherUserCode = ouc + "," + SerFirst.Code;
- }
- cs.UpdateUser(cususer);//此次负责的客服更新到次要负责客服里面
- }
- }
- }
- SerFirst.Count = SerFirst.Count + 1;
- return SerFirst.SessionID;
- }
- }
- }
|