Nessuna descrizione

ChatServer.cs 36KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829
  1. 
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. using System.Configuration;
  8. using SuperSocket.SocketBase;
  9. using SuperWebSocket;
  10. using SuperSocket.SocketBase.Config;
  11. using Newtonsoft.Json;
  12. using Newtonsoft.Json.Linq;
  13. namespace CallCenter.WebChatServer
  14. {
  15. public class ChatServer
  16. {
  17. WebSocketServer server = new WebSocketServer();
  18. ChatSql cs = new ChatSql();
  19. public List<ChatClass.Servicer> Servicers = new List<ChatClass.Servicer>();
  20. public List<ChatClass.Customer> Customers = new List<ChatClass.Customer>();
  21. public ChatServer()
  22. {
  23. }
  24. /// <summary>
  25. /// 初始化服务
  26. /// </summary>
  27. /// <returns></returns>
  28. public bool Setup()
  29. {
  30. ServerConfig serverConfig = new ServerConfig
  31. {
  32. Ip = ConfigurationManager.AppSettings["ip"],
  33. Port = Int32.Parse(ConfigurationManager.AppSettings["port"]),//set the listening port
  34. MaxConnectionNumber = Int32.Parse(ConfigurationManager.AppSettings["maxnumber"])
  35. };
  36. //WebSocket服务器端启动
  37. if (!server.Setup(serverConfig))
  38. {
  39. server.Logger.Error("WebSocket服务器端启动失败");
  40. //处理启动失败消息
  41. return false;
  42. }
  43. //新的会话连接时
  44. server.NewSessionConnected += server_NewSessionConnected;
  45. //会话关闭
  46. server.SessionClosed += server_SessionClosed;
  47. //接收到新的消息时
  48. server.NewMessageReceived += server_NewMessageReceived;
  49. return true;
  50. }
  51. /// <summary>
  52. /// 开启服务
  53. /// </summary>
  54. /// <returns></returns>
  55. public int Start()
  56. {
  57. if (server.State == ServerState.NotStarted)
  58. {
  59. if (!server.Start())
  60. {
  61. server.Logger.Error(string.Format("开启WebSocket服务侦听失败:{0}:{1}", server.Config.Ip, server.Config.Port));
  62. //处理监听失败消息
  63. return 3;
  64. }
  65. }
  66. else
  67. {
  68. return 2;
  69. }
  70. return 1;
  71. }
  72. /// <summary>
  73. /// 关闭服务
  74. /// </summary>
  75. /// <returns></returns>
  76. public int Stop()
  77. {
  78. if (server.State == ServerState.Running)
  79. {
  80. server.Stop();
  81. }
  82. else
  83. {
  84. return 2;
  85. }
  86. return 1;
  87. }
  88. /// <summary>
  89. /// 关闭服务
  90. /// </summary>
  91. /// <returns></returns>
  92. public ServerState State()
  93. {
  94. return server.State;
  95. }
  96. /// <summary>
  97. /// 接收到消息
  98. /// </summary>
  99. /// <param name="session"></param>
  100. /// <param name="value"></param>
  101. private void server_NewMessageReceived(WebSocketSession session, string value)
  102. {
  103. try
  104. {
  105. var ip = session.RemoteEndPoint.Address.ToString();
  106. ChatClass.Message msg = JsonConvert.DeserializeObject<ChatClass.Message>(value);
  107. msg.state = 1;
  108. switch (msg.action.ToLower())
  109. {
  110. case "cusconn":
  111. #region 客户连接
  112. if (!cs.IsBlack(ip))
  113. {
  114. ChatClass.Customer cus = new ChatClass.Customer();
  115. //添加到客户组
  116. string code = msg.code;
  117. if (string.IsNullOrEmpty(code))//为空是网站,不为空是微信
  118. {
  119. code = cs.GetCode();
  120. }
  121. msg.code = code;
  122. var cusconn = Customers.Where(p => p.Code == code).FirstOrDefault();
  123. if (cusconn == null)
  124. {
  125. var cususer = cs.GetCusUser(code);//获取是否存在此客户
  126. if (cususer == null)
  127. {
  128. ChatSql.T_Chat_User user = new ChatSql.T_Chat_User();
  129. user.F_OpenId = code;
  130. user.F_Account = code;
  131. user.F_Type = 1;
  132. user.F_State = 0;
  133. user.F_IsDelete = 0;
  134. user.F_CreateTime = DateTime.Now;
  135. user.F_Id = cs.AddUser(user);
  136. cususer = user;
  137. }
  138. if (string.IsNullOrEmpty(cususer.F_Name))
  139. {
  140. cususer.F_Name = ConfigurationManager.AppSettings["anyname"];
  141. }
  142. if (string.IsNullOrEmpty(cususer.F_IP))
  143. {
  144. cususer.F_IP = ip;
  145. }
  146. cs.UpdateUser(cususer);
  147. cus.Name = cususer.F_Name;
  148. cus.HeadImgUrl = cususer.F_HeadImgUrl;
  149. msg.name = cus.Name;
  150. msg.headimgurl = cus.HeadImgUrl;
  151. cus.SessionID = session.SessionID;
  152. cus.Code = code;
  153. cus.IsSend = 0;
  154. //if (Servicers.Count <= 0)
  155. //{
  156. // ChatClass.Message newmsg = new ChatClass.Message();
  157. // newmsg.action = "ServicersAllOff";
  158. // newmsg.msg = ConfigurationManager.AppSettings["busy"];
  159. // session.Send(JsonConvert.SerializeObject(newmsg));//向客户发送客服不在线
  160. //}
  161. if (Servicers.Count > 0)
  162. {
  163. cus.ServicerSessionID = SplitCustomer(cus);
  164. }
  165. ChatSql.T_Chat_IPList ipmodel = new ChatSql.T_Chat_IPList();
  166. ipmodel = cs.GetIPInfo(ip, code);
  167. if (ipmodel == null)
  168. {
  169. #region ip记录
  170. ipmodel = new ChatSql.T_Chat_IPList();
  171. //string ipinfojson = ChatCommon.HttpGet(ConfigurationManager.AppSettings["ipurl"] + "?ip=" + ip);
  172. //var ipinfos = JsonConvert.DeserializeObject<JObject>(ipinfojson);
  173. //var ipinfo = JsonConvert.DeserializeObject<JObject>(ipinfos["data"].ToString());
  174. ipmodel.F_IP = ip;
  175. ipmodel.F_OpenId = cus.Code;
  176. ipmodel.F_Type = 2;
  177. //ipmodel.F_Country = ipinfo["country"].ToString();
  178. //ipmodel.F_CountryCode = ipinfo["country_id"].ToString();
  179. //ipmodel.F_Area = ipinfo["area"].ToString();
  180. //ipmodel.F_AreaCode = ipinfo["area_id"].ToString();
  181. //ipmodel.F_Region = ipinfo["region"].ToString();
  182. //ipmodel.F_RegionCode = ipinfo["region_id"].ToString();
  183. //ipmodel.F_City = ipinfo["city"].ToString();
  184. //ipmodel.F_CityCode = ipinfo["city_id"].ToString();
  185. //ipmodel.F_County = ipinfo["county"].ToString();
  186. //ipmodel.F_CountyCode = ipinfo["county_id"].ToString();
  187. //ipmodel.F_ISP = ipinfo["isp"].ToString();
  188. //ipmodel.F_ISPCode = ipinfo["isp_id"].ToString();
  189. ipmodel.F_CreateTime = DateTime.Now;
  190. cs.AddIP(ipmodel);
  191. #endregion
  192. }
  193. msg.data = ipmodel;
  194. #region 签入时间
  195. ChatSql.T_Chat_InOut inoutmodel = new ChatSql.T_Chat_InOut();
  196. inoutmodel.F_OpenId = cus.Code;
  197. inoutmodel.F_IP = ip;
  198. inoutmodel.F_Type = 2;
  199. inoutmodel.F_InTime = DateTime.Now;
  200. cs.AddInOut(inoutmodel);
  201. #endregion
  202. cus.IPData = ipmodel;
  203. Customers.Add(cus);//将客户新增到在线客户列表
  204. ChatClass.Message serntcmsg = new ChatClass.Message();
  205. serntcmsg.action = "serreceive";
  206. serntcmsg.msg = cus.Name + " 上线";
  207. serntcmsg.code = cus.Code;
  208. serntcmsg.name = cus.Name;
  209. serntcmsg.data = ipmodel;
  210. serntcmsg.state = 0;
  211. SendMsgToRemotePoint(cus.ServicerSessionID, serntcmsg);
  212. }
  213. else
  214. {
  215. msg.code = "";
  216. msg.state = 0;
  217. msg.msg = "请不要打开多个聊天窗口";
  218. }
  219. }
  220. else
  221. {
  222. msg.state = 0;
  223. msg.msg = ConfigurationManager.AppSettings["black"];
  224. }
  225. #endregion
  226. break;
  227. case "cussend":
  228. #region 客户发送消息
  229. if (!cs.IsBlack(ip))
  230. {
  231. var cussend = Customers.Where(p => p.SessionID == session.SessionID).FirstOrDefault();
  232. if (cussend != null)
  233. {
  234. if (Servicers.Count <= 0)
  235. {
  236. cussend.IsSend = 1;
  237. msg.state = 0;
  238. msg.msg = ConfigurationManager.AppSettings["busy"];
  239. }
  240. else
  241. {
  242. if (string.IsNullOrEmpty(cussend.ServicerSessionID))
  243. {
  244. cussend.ServicerSessionID = SplitCustomer(cussend);
  245. }
  246. ChatClass.Message serrecmsg = new ChatClass.Message();
  247. serrecmsg.action = "serreceive";
  248. serrecmsg.msg = msg.msg;
  249. serrecmsg.code = cussend.Code;
  250. serrecmsg.name = cussend.Name;
  251. serrecmsg.headimgurl = cussend.HeadImgUrl;
  252. serrecmsg.state = 1;
  253. if (SendMsgToRemotePoint(cussend.ServicerSessionID, serrecmsg))
  254. {
  255. var serreceive = Servicers.Where(p => p.SessionID == cussend.ServicerSessionID).FirstOrDefault();
  256. ChatSql.T_Chat_Message cusmsg = new ChatSql.T_Chat_Message();
  257. cusmsg.F_FromUser = cussend.Code;
  258. cusmsg.F_ToUser = serreceive.Code;
  259. cusmsg.F_Message = msg.msg;
  260. cusmsg.F_IP = ip;
  261. cusmsg.F_SourceType = 1;
  262. cusmsg.F_MessageType = 1;
  263. cusmsg.F_State = 0;
  264. cusmsg.F_IsDelete = 0;
  265. cusmsg.F_CreateTime = DateTime.Now;
  266. cusmsg.F_CreateUser = serreceive.Code;
  267. cs.AddMsg(cusmsg);
  268. }
  269. else
  270. {
  271. //ChatClass.Message newmsg = new ChatClass.Message();
  272. //newmsg.action = "CusSendError";
  273. //newmsg.msg = "发送失败";
  274. //session.Send(JsonConvert.SerializeObject(newmsg));
  275. msg.state = 0;
  276. msg.msg = "发送失败";
  277. }
  278. }
  279. }
  280. else
  281. {
  282. msg.state = 0;
  283. msg.msg = "发送失败";
  284. }
  285. }
  286. else
  287. {
  288. msg.state = 0;
  289. msg.msg = ConfigurationManager.AppSettings["black"];
  290. }
  291. #endregion
  292. break;
  293. case "loglist":
  294. #region 聊天记录
  295. int count = Int32.Parse(ConfigurationManager.AppSettings["pagenumer"]);
  296. long num = 0;
  297. long.TryParse(msg.msg, out num);
  298. int isfirst = 0;
  299. var dt = cs.GetChatLog(msg.code, out num, out isfirst, count, num);
  300. var obj = new
  301. {
  302. rows = dt,
  303. num = num,
  304. isfirst = isfirst
  305. };
  306. msg.data = obj;
  307. #endregion
  308. break;
  309. case "serconn":
  310. #region 客服连接
  311. var serconn = Servicers.Where(p => p.Code == msg.code).FirstOrDefault();
  312. if (serconn == null)
  313. {
  314. ChatClass.Servicer svc = new ChatClass.Servicer();
  315. svc.SessionID = session.SessionID;
  316. svc.Code = msg.code;
  317. svc.Name = cs.GetUserName(msg.code);
  318. svc.Count = 0;
  319. svc.State = 1;
  320. Servicers.Add(svc);
  321. session.Send(JsonConvert.SerializeObject(msg));
  322. if (Servicers.Count == 1)
  323. {
  324. foreach (var cuson in Customers)
  325. {
  326. cuson.ServicerSessionID= session.SessionID;
  327. ChatClass.Message newmsg = new ChatClass.Message();
  328. newmsg.action = "serreceive";
  329. newmsg.msg = cuson.Name + " 上线";
  330. newmsg.code = cuson.Code;
  331. newmsg.name = cuson.Name;
  332. newmsg.data = cuson.IPData;
  333. newmsg.state = 0;
  334. SendMsgToRemotePoint(session.SessionID, newmsg);//向客服发送客户上线通知
  335. }
  336. }
  337. if (!cs.IsExitIP(ip, msg.code))
  338. {
  339. #region IP记录
  340. //string ipinfojson = ChatCommon.HttpGet(ConfigurationManager.AppSettings["ipurl"] + "?ip=" + ip);
  341. //var ipinfos = JsonConvert.DeserializeObject<JObject>(ipinfojson);
  342. //var ipinfo = JsonConvert.DeserializeObject<JObject>(ipinfos["data"].ToString());
  343. ChatSql.T_Chat_IPList ipmodel = new ChatSql.T_Chat_IPList();
  344. ipmodel.F_IP = ip;
  345. ipmodel.F_OpenId = msg.code;
  346. ipmodel.F_Type = 1;
  347. //ipmodel.F_Country = ipinfo["country"].ToString();
  348. //ipmodel.F_CountryCode = ipinfo["country_id"].ToString();
  349. //ipmodel.F_Area = ipinfo["area"].ToString();
  350. //ipmodel.F_AreaCode = ipinfo["area_id"].ToString();
  351. //ipmodel.F_Region = ipinfo["region"].ToString();
  352. //ipmodel.F_RegionCode = ipinfo["region_id"].ToString();
  353. //ipmodel.F_City = ipinfo["city"].ToString();
  354. //ipmodel.F_CityCode = ipinfo["city_id"].ToString();
  355. //ipmodel.F_County = ipinfo["county"].ToString();
  356. //ipmodel.F_CountyCode = ipinfo["county_id"].ToString();
  357. //ipmodel.F_ISP = ipinfo["isp"].ToString();
  358. //ipmodel.F_ISPCode = ipinfo["isp_id"].ToString();
  359. ipmodel.F_CreateTime = DateTime.Now;
  360. cs.AddIP(ipmodel);
  361. #endregion
  362. }
  363. #region 签入时间
  364. ChatSql.T_Chat_InOut inoutmodel = new ChatSql.T_Chat_InOut();
  365. inoutmodel.F_OpenId = msg.code;
  366. inoutmodel.F_IP = ip;
  367. inoutmodel.F_Type = 1;
  368. inoutmodel.F_InTime = DateTime.Now;
  369. cs.AddInOut(inoutmodel);
  370. #endregion
  371. }
  372. else
  373. {
  374. //ChatClass.Message newmsg = new ChatClass.Message();
  375. //newmsg.action = "SerConnError";
  376. //newmsg.msg = "此工号已经存在";
  377. //session.Send(JsonConvert.SerializeObject(newmsg));
  378. msg.state = 0;
  379. msg.msg = "此工号已经存在";
  380. session.Send(JsonConvert.SerializeObject(msg));
  381. }
  382. #endregion
  383. break;
  384. case "sersend":
  385. #region 客服发送消息
  386. var cusreceive = Customers.Where(p => p.Code == msg.code).FirstOrDefault();
  387. if (cusreceive != null)
  388. {
  389. var sersend = Servicers.Where(p => p.SessionID == session.SessionID).FirstOrDefault();
  390. ChatClass.Message recmsg = new ChatClass.Message();
  391. recmsg.action = "cusreceive";
  392. recmsg.msg = msg.msg;
  393. recmsg.code = sersend.Code;
  394. recmsg.name = sersend.Name;
  395. recmsg.headimgurl = sersend.HeadImgUrl;
  396. if (SendMsgToRemotePoint(cusreceive.SessionID, recmsg))
  397. {
  398. ChatSql.T_Chat_Message sermsg = new ChatSql.T_Chat_Message();
  399. sermsg.F_FromUser = sersend.Code;
  400. sermsg.F_ToUser = cusreceive.Code;
  401. sermsg.F_Message = msg.msg;
  402. sermsg.F_IP = ip;
  403. sermsg.F_SourceType = 1;
  404. sermsg.F_MessageType = 1;
  405. sermsg.F_State = 0;
  406. sermsg.F_IsDelete = 0;
  407. sermsg.F_CreateTime = DateTime.Now;
  408. sermsg.F_CreateUser = sersend.Code;
  409. cs.AddMsg(sermsg);
  410. }
  411. else
  412. {
  413. //ChatClass.Message newmsg = new ChatClass.Message();
  414. //newmsg.action = "SerSendError";
  415. //newmsg.msg = "发送失败";
  416. //session.Send(JsonConvert.SerializeObject(newmsg));
  417. msg.state = 0;
  418. msg.msg = "发送失败";
  419. }
  420. }
  421. else
  422. {
  423. //ChatClass.Message newmsg = new ChatClass.Message();
  424. //newmsg.action = "SerSendError";
  425. //newmsg.msg = "客户已下线";
  426. //session.Send(JsonConvert.SerializeObject(newmsg));
  427. msg.state = 0;
  428. msg.msg = "客户已下线";
  429. }
  430. #endregion
  431. break;
  432. case "cusmass":
  433. #region 群发客户
  434. var cusss = Customers;
  435. if (!string.IsNullOrEmpty(msg.code))
  436. {
  437. cusss = Customers.Where(p => msg.code.Split(',').Contains(p.Code)).ToList();
  438. }
  439. foreach (var cuss in cusss)
  440. {
  441. ChatClass.Message recmsg = new ChatClass.Message();
  442. recmsg.action = "cusreceive";
  443. recmsg.msg = msg.msg;
  444. recmsg.code = cuss.Code;
  445. recmsg.name = cuss.Name;
  446. recmsg.headimgurl = cuss.HeadImgUrl;
  447. recmsg.state = 0;
  448. if (SendMsgToRemotePoint(cuss.SessionID, recmsg))
  449. {
  450. //ChatSql.T_Chat_Message sermsg = new ChatSql.T_Chat_Message();
  451. //sermsg.F_FromUser = msg.code;
  452. //sermsg.F_ToUser = cuss.Code;
  453. //sermsg.F_Message = msg.msg;
  454. //sermsg.F_IP = session.RemoteEndPoint.Address.ToString();
  455. //sermsg.F_SourceType = 1;
  456. //sermsg.F_MessageType = 1;
  457. //sermsg.F_State = 0;
  458. //sermsg.F_IsDelete = 0;
  459. //sermsg.F_CreateTime = DateTime.Now;
  460. //sermsg.F_CreateUser = msg.code;
  461. //cs.AddMsg(sermsg);
  462. }
  463. }
  464. #endregion
  465. break;
  466. case "sermass":
  467. #region 群发客服
  468. var serss = Servicers;
  469. if (!string.IsNullOrEmpty(msg.code))
  470. {
  471. serss = Servicers.Where(p => msg.code.Split(',').Contains(p.Code)).ToList();
  472. }
  473. foreach (var sers in serss)
  474. {
  475. ChatClass.Message recmsg = new ChatClass.Message();
  476. recmsg.action = "serreceive";
  477. recmsg.msg = msg.msg;
  478. recmsg.code = sers.Code;
  479. recmsg.name = sers.Name;
  480. recmsg.headimgurl = sers.HeadImgUrl;
  481. recmsg.state = 0;
  482. if (SendMsgToRemotePoint(sers.SessionID, recmsg))
  483. {
  484. //ChatSql.T_Chat_Message sermsg = new ChatSql.T_Chat_Message();
  485. //sermsg.F_FromUser = msg.code;
  486. //sermsg.F_ToUser = sers.Code;
  487. //sermsg.F_Message = msg.msg;
  488. //sermsg.F_IP = session.RemoteEndPoint.Address.ToString();
  489. //sermsg.F_SourceType = 1;
  490. //sermsg.F_MessageType = 1;
  491. //sermsg.F_State = 0;
  492. //sermsg.F_IsDelete = 0;
  493. //sermsg.F_CreateTime = DateTime.Now;
  494. //sermsg.F_CreateUser = msg.code;
  495. //cs.AddMsg(sermsg);
  496. }
  497. }
  498. #endregion
  499. break;
  500. case "custran":
  501. #region 转移客户
  502. var scus = Customers.Where(p => p.Code == msg.code).FirstOrDefault();
  503. var tser = Servicers.Where(p => p.Code == msg.data.ToString()).FirstOrDefault();
  504. if (scus == null)
  505. {
  506. msg.state = 0;
  507. msg.msg = "客户已下线,不能转移";
  508. }
  509. if (tser == null)
  510. {
  511. msg.state = 0;
  512. msg.msg = "客服已下线,不能转移";
  513. }
  514. if (tser.State == 0)
  515. {
  516. msg.state = 0;
  517. msg.msg = "客服已置忙,不能转移";
  518. }
  519. if (scus != null && tser != null && tser.State == 1)
  520. {
  521. var yser = Servicers.Where(p => p.SessionID==session.SessionID).FirstOrDefault();
  522. scus.ServicerSessionID = tser.SessionID;
  523. yser.Count = yser.Count - 1;
  524. tser.Count = tser.Count + 1;
  525. ChatClass.Message newmsg = new ChatClass.Message();
  526. newmsg.action = "serreceive";
  527. newmsg.msg = yser.Name + " 转移给你 " + scus.Name;
  528. newmsg.code = scus.Code;
  529. newmsg.name = scus.Name;
  530. newmsg.state = 0;
  531. SendMsgToRemotePoint(scus.ServicerSessionID, newmsg);//向客服发送客户转移通知
  532. }
  533. #endregion
  534. break;
  535. case "serbusy"://客服置忙
  536. Servicers.Where(p => p.Code == msg.code).FirstOrDefault().State = 0;
  537. break;
  538. case "serfree"://客服置闲
  539. Servicers.Where(p => p.Code == msg.code).FirstOrDefault().State = 1;
  540. break;
  541. case "cuslist"://当前在线客户
  542. msg.data = Customers;
  543. break;
  544. case "serlist"://当前在线客服
  545. msg.data = Servicers;
  546. break;
  547. }
  548. if (msg.action.ToLower() != "serconn")
  549. {
  550. msg.time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
  551. session.Send(JsonConvert.SerializeObject(msg));
  552. }
  553. }
  554. catch
  555. {
  556. try
  557. {
  558. ChatClass.Message msg = JsonConvert.DeserializeObject<ChatClass.Message>(value);
  559. msg.state = 0;
  560. msg.msg = "操作失败";
  561. msg.time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
  562. session.Send(JsonConvert.SerializeObject(msg));
  563. }
  564. catch
  565. {
  566. session.Send(value);
  567. }
  568. }
  569. }
  570. /// <summary>
  571. /// 会话关闭
  572. /// </summary>
  573. /// <param name="session"></param>
  574. /// <param name="value"></param>
  575. private void server_SessionClosed(WebSocketSession session, SuperSocket.SocketBase.CloseReason value)
  576. {
  577. var ses = Customers.Where(p => p.SessionID == session.SessionID).FirstOrDefault();
  578. if (ses != null)
  579. {
  580. Customers.Remove(ses);
  581. //Customers = Customers.Where(p => p.SessionID != session.SessionID).ToList();
  582. ChatClass.Message msg = new ChatClass.Message();
  583. msg.action = "serreceive";
  584. msg.code = ses.Code;
  585. msg.name = ses.Name;
  586. msg.state = 0;
  587. msg.msg = ses.Name+" 下线";
  588. SendMsgToRemotePoint(ses.ServicerSessionID, msg);
  589. cs.UpdateOutTime(ses.Code);
  590. }
  591. else
  592. {
  593. var ses1 = Servicers.Where(p => p.SessionID == session.SessionID).FirstOrDefault();
  594. if (ses1 != null)
  595. {
  596. Servicers.Remove(ses1);
  597. Servicers = Servicers.Where(p => p.SessionID != session.SessionID).ToList();
  598. int sercon = Servicers.Count;
  599. var cuss = Customers.Where(p => p.ServicerSessionID == session.SessionID);
  600. foreach (var cus in cuss)
  601. {
  602. if (sercon > 0)
  603. {
  604. cus.ServicerSessionID = SplitCustomer(cus);
  605. ChatClass.Message newmsg = new ChatClass.Message();
  606. newmsg.action = "serreceive";
  607. newmsg.msg = ses1.Name + " 下线," + cus.Name + " 转移给你";
  608. newmsg.code = cus.Code;
  609. newmsg.name = cus.Name;
  610. newmsg.state = 0;
  611. SendMsgToRemotePoint(cus.ServicerSessionID, newmsg);//向客服发送客户转移通知
  612. }
  613. else
  614. {
  615. cus.ServicerSessionID = "";
  616. }
  617. }
  618. cs.UpdateOutTime(ses1.Code);
  619. }
  620. }
  621. server.Logger.Info(string.Format("会话关闭,关闭原因:{0} 来自:{1} SessionID:{2} 时间:{3:HH:MM:ss}", value, session.RemoteEndPoint, session.SessionID, DateTime.Now));
  622. }
  623. /// <summary>
  624. /// 新的会话链接
  625. /// </summary>
  626. /// <param name="session"></param>
  627. private void server_NewSessionConnected(WebSocketSession session)
  628. {
  629. server.Logger.Info(string.Format("新的会话连接 来自:{0} SessionID:{1} 时间:{2:HH:MM:ss}", session.RemoteEndPoint, session.SessionID, DateTime.Now));
  630. }
  631. /// <summary>
  632. /// 发送消息到
  633. /// </summary>
  634. /// <param name="sessionId"></param>
  635. /// <param name="msg"></param>
  636. private bool SendMsgToRemotePoint(string sessionId, ChatClass.Message newmsg)
  637. {
  638. newmsg.time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
  639. string msg = JsonConvert.SerializeObject(newmsg);
  640. bool bl = false;
  641. var selsession = server.GetSessionByID(sessionId);
  642. if (selsession != null)
  643. {
  644. selsession.Send(msg);
  645. bl = true;
  646. }
  647. return bl;
  648. }
  649. /// <summary>
  650. /// 发送消息到客户
  651. /// </summary>
  652. /// <param name="codes">为空全部发送,多个用逗号隔开</param>
  653. /// <param name="msg"></param>
  654. private void SendMsgToCustomer(string codes, ChatClass.Message newmsg)
  655. {
  656. newmsg.time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
  657. string msg = JsonConvert.SerializeObject(newmsg);
  658. var cuss = Customers;
  659. if (!string.IsNullOrEmpty(codes))
  660. {
  661. cuss = Customers.Where(p => codes.Split(',').Contains(p.Code)).ToList();
  662. }
  663. foreach (var cus in cuss)
  664. {
  665. var selsession = server.GetSessionByID(cus.SessionID);
  666. if (selsession != null)
  667. {
  668. selsession.Send(msg);
  669. }
  670. }
  671. }
  672. /// <summary>
  673. /// 发送消息到客服
  674. /// </summary>
  675. /// <param name="codes">为空全部发送,多个用逗号隔开</param>
  676. /// <param name="msg"></param>
  677. private void SendMsgToServicer(string codes, ChatClass.Message newmsg)
  678. {
  679. newmsg.time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
  680. string msg = JsonConvert.SerializeObject(newmsg);
  681. var sers = Servicers;
  682. if (!string.IsNullOrEmpty(codes))
  683. {
  684. sers = Servicers.Where(p => codes.Split(',').Contains(p.Code)).ToList();
  685. }
  686. foreach (var ser in sers)
  687. {
  688. var selsession = server.GetSessionByID(ser.SessionID);
  689. if (selsession != null)
  690. {
  691. selsession.Send(msg);
  692. }
  693. }
  694. }
  695. /// <summary>
  696. /// 分配客户给客服
  697. /// </summary>
  698. /// <param name="cussend"></param>
  699. /// <returns></returns>
  700. private string SplitCustomer(ChatClass.Customer cussend)
  701. {
  702. var cususer = cs.GetCusUser(cussend.Code);//获取是否存在此客户
  703. ChatClass.Servicer SerFirst = Servicers.Where(p => p.State == 1).OrderBy(p => p.Count).FirstOrDefault();//获取当前在线客服的用户量最少的一个
  704. if (string.IsNullOrEmpty(cususer.F_MainUserCode))
  705. {
  706. cususer.F_MainUserCode = SerFirst.Code;
  707. cs.UpdateUser(cususer);//此次负责的客服更新到主要负责客服里面
  708. }
  709. else
  710. {
  711. var mser = Servicers.Where(p => p.Code == cususer.F_MainUserCode && p.State==1).FirstOrDefault();//获取此客户的主要负责客服是否在线
  712. if (mser != null)
  713. {
  714. SerFirst = mser;
  715. }
  716. else//主要负责客服不在线
  717. {
  718. var oser = Servicers.Where(p => cususer.F_OtherUserCode.Split(',').Contains(p.Code) && p.State == 1).FirstOrDefault();//获取此客户的次要负责客服是否在线
  719. if (oser != null)
  720. {
  721. SerFirst = mser;
  722. }
  723. else//次要负责客服不在线
  724. {
  725. string ouc = cususer.F_OtherUserCode;
  726. if (string.IsNullOrEmpty(ouc))
  727. {
  728. cususer.F_OtherUserCode = ouc;
  729. }
  730. else
  731. {
  732. cususer.F_OtherUserCode = ouc + "," + SerFirst.Code;
  733. }
  734. cs.UpdateUser(cususer);//此次负责的客服更新到次要负责客服里面
  735. }
  736. }
  737. }
  738. SerFirst.Count = SerFirst.Count + 1;
  739. return SerFirst.SessionID;
  740. }
  741. }
  742. }