Geen omschrijving

ChatServer.cs 45KB

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