IM12345_Api demo - 代码源于 商丘市12345项目

ChatServer.cs 46KB

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