WeAppMsgClientManager.cs 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Reflection;
  5. using Abp.Configuration;
  6. using Abp.Dependency;
  7. using Abp.Domain.Repositories;
  8. using Abp.Domain.Uow;
  9. using Abp.Runtime.Caching;
  10. using IwbZero.ToolCommon;
  11. using IwbZero.ToolCommon.LogHelpers;
  12. using IwbZero.ToolCommon.StringModel;
  13. using Microsoft.AspNet.SignalR;
  14. using uPLibrary.Networking.M2Mqtt.Messages;
  15. using WeApp.Configuration;
  16. using WeApp.Configuration.Cache;
  17. using WeApp.Hubs;
  18. using WeApp.TrainingCamp;
  19. using WeEngine.CommonDto;
  20. using WeEngine.Enum;
  21. using WeEngine.Message;
  22. using WeEngine.Packages;
  23. using WeMessageService;
  24. namespace WeApp.CommonManager.MqttClient
  25. {
  26. public class WeAppMsgClientManager : ISingletonDependency
  27. {
  28. public WeAppMsgClientManager(ISettingManager settingManager, IRepository<CampGroupInfo, string> groupRepository,
  29. IRepository<GroupScoreInfo> gsRepository, IRepository<CampInfo, string> campRepository, IUnitOfWorkManager unitOfWorkManager, ICacheManager cacheManager, IRepository<GroupLogInfo> glRepository)
  30. {
  31. SettingManager = settingManager;
  32. GroupRepository = groupRepository;
  33. GsRepository = gsRepository;
  34. CampRepository = campRepository;
  35. UnitOfWorkManager = unitOfWorkManager;
  36. CacheManager = cacheManager;
  37. GlRepository = glRepository;
  38. IwbHubContext = GlobalHost.ConnectionManager.GetHubContext<IwbHub>();
  39. if (!Client.IsConnected)
  40. {
  41. RegisterClient();
  42. }
  43. }
  44. private static readonly Dictionary<string, ScenePusher> _scenePushes = new Dictionary<string, ScenePusher>();
  45. private string _url => SettingManager.GetSettingValue(IwbSettingNames.WeDataCenterIp);
  46. private string _engineUrl => SettingManager.GetSettingValue(IwbSettingNames.WeEngineIp);
  47. private static M2MqttMsgClient Client = new M2MqttMsgClient();
  48. private IUnitOfWorkManager UnitOfWorkManager { get; }
  49. private ISettingManager SettingManager { get; }
  50. private ICacheManager CacheManager { get; }
  51. private IRepository<CampInfo, string> CampRepository { get; }
  52. private IRepository<CampGroupInfo, string> GroupRepository { get; }
  53. private IRepository<GroupScoreInfo> GsRepository { get; }
  54. private IRepository<GroupLogInfo> GlRepository { get; }
  55. protected IHubContext IwbHubContext { get; }
  56. #region MSG-Client
  57. public string ClientId { get; set; }
  58. /// <summary>
  59. /// 强制刷新客户端
  60. /// </summary>
  61. public void RefreshClient()
  62. {
  63. this.LogInfo($"客户端{ClientId}开始强制刷新!");
  64. Client.DisConnect();
  65. Client = new M2MqttMsgClient();
  66. RegisterClient();
  67. SendMessage(ClientId, $"客户端{ClientId}已强制刷新!");
  68. SendMessage("WeEngine", $"客户端{ClientId}已强制刷新!");
  69. }
  70. /// <summary>
  71. /// 注册客户端
  72. /// </summary>
  73. public void RegisterClient()
  74. {
  75. ClientId = IwbConsts.ClientName;
  76. #if DEBUG
  77. var result = new MsgClientDto()
  78. {
  79. AppId = ClientId,
  80. Name = "智慧演练系统",
  81. SecretKey = "WePlatformWeApp",
  82. ServerIp = "shvber.com",
  83. ServerPort = 1885,
  84. };
  85. #else
  86. MsgClientDto result = CacheManager.GetMsgClientDto(ClientId, _url);
  87. if (result == null)
  88. {
  89. //throw new UserFriendlyException("未查询到消息客户端配置!");
  90. this.LogError($"未查询到消息客户端{ClientId}的配置!");
  91. return;
  92. }
  93. #endif
  94. //var result = new MsgClientDto()
  95. //{
  96. // Name = "智慧演练系统",
  97. // AppId = "WeApp",
  98. // SecretKey = "WePlatformWeApp",
  99. // ServerIp = "shvber.com",
  100. // ServerPort = 1885
  101. //};
  102. //var result = new MsgClientDto()
  103. //{
  104. // Name = "admin",
  105. // AppId = "WeApp",
  106. // SecretKey = "admin123456",
  107. // ServerIp = "shvber.com",
  108. // ServerPort = 1883
  109. //};
  110. Client.SetOptions(result.ServerIp, result.ServerPort, ClientId, result.Name, result.SecretKey);
  111. Client.SetReceivedHandler(ReceivedHandler);
  112. Subscribe();
  113. }
  114. private void Subscribe()
  115. {
  116. if (Client.CheckClient())
  117. {
  118. Client.SubscribeTopic(ClientId, false);
  119. IwbHubContext.Clients.Group(ClientId).getMqttMsg(new { topic = ClientId, msg = "订阅主题" });
  120. Client.SubscribeTopic("Heartbeat");
  121. IwbHubContext.Clients.Group(ClientId).getMqttMsg(new { topic = $"{ClientId}/Heartbeat", msg = "订阅主题" });
  122. var t = typeof(MessageType);
  123. var fts = t.GetFields(BindingFlags.Static | BindingFlags.Public);
  124. foreach (var f in fts)
  125. {
  126. string name = f.Name;
  127. Client.SubscribeTopic($"{name}/+");
  128. IwbHubContext.Clients.Group(ClientId).getMqttMsg(new { topic = $"{ClientId}/{name}/+", msg = "订阅主题" });
  129. //AsyncHelper.RunSync(() => Client.SubscribeTopic(name));
  130. }
  131. }
  132. }
  133. public void SendMessage(WeMessage message, MessageType type, string clientId = null)
  134. {
  135. if (Client.NotValidate)
  136. {
  137. RegisterClient();
  138. }
  139. var msg = message.Obj2String();
  140. Client.SendMsg(type.ToString(), msg, clientId);
  141. IwbHubContext.Clients.Group(ClientId).getSendMqttMsg(new { topic = $"{ClientId}/{type}/", msg });
  142. }
  143. public void SendMessage(WeMessage message)
  144. {
  145. if (Client.NotValidate)
  146. {
  147. RegisterClient();
  148. }
  149. var msg = message.Obj2String();
  150. Client.SendMsg(message.Type.ToString(), msg, message.TargetClientId);
  151. IwbHubContext.Clients.Group(ClientId).getSendMqttMsg(new { topic = $"{message.TargetClientId}/{message.Type}/", msg });
  152. }
  153. public void SendMessage(string msg)
  154. {
  155. if (Client.NotValidate)
  156. {
  157. RegisterClient();
  158. }
  159. Client.SendMessage(ClientId, msg);
  160. IwbHubContext.Clients.Group(ClientId).getSendMqttMsg(new { topic = $"{ClientId}", msg });
  161. }
  162. public void SendMessage(string topic, string msg)
  163. {
  164. if (Client.NotValidate)
  165. {
  166. RegisterClient();
  167. }
  168. Client.SendMessage(topic, msg);
  169. IwbHubContext.Clients.Group(ClientId).getSendMqttMsg(new { topic, msg });
  170. }
  171. /// <summary>
  172. /// 消息接受回调处理
  173. /// </summary>
  174. /// <param name="msg"></param>
  175. private void ReceiveMsgHandler(string msg)
  176. {
  177. try
  178. {
  179. var message = msg.Str2Obj<WeMessage>();
  180. if (message != null)
  181. {
  182. switch (message.Type)
  183. {
  184. case MessageType.Start:
  185. ReceiveStart(message);
  186. break;
  187. case MessageType.End:
  188. ReceiveEnd(message);
  189. break;
  190. case MessageType.RunningInfo:
  191. ReceiveRunningInfo(message);
  192. break;
  193. case MessageType.RoundScore:
  194. ReceiveRoundScore(message);
  195. break;
  196. case MessageType.SceneInfo:
  197. ReceiveScene(message);
  198. break;
  199. case MessageType.GuideInfo:
  200. ReceiveGuide(message);
  201. break;
  202. case MessageType.Environment:
  203. ReceiveEnvironment(message);
  204. break;
  205. case MessageType.CommandMatchSuccess:
  206. ReceiveMatchSuccess(message);
  207. break;
  208. case MessageType.CommonMessage:
  209. ReceiveCommonMsg(message);
  210. break;
  211. }
  212. }
  213. else
  214. {
  215. typeof(WeAppMsgClientManager).LogError("MSG ERROR:" + msg);
  216. }
  217. }
  218. catch (Exception e)
  219. {
  220. typeof(WeAppMsgClientManager).LogError(e);
  221. }
  222. }
  223. /// <summary>
  224. /// 消息接受回调处理
  225. /// </summary>
  226. /// <param name="sender"></param>
  227. /// <param name="e"></param>
  228. private void ReceivedHandler(object sender, MqttMsgPublishEventArgs e)
  229. {
  230. string msg = System.Text.Encoding.UTF8.GetString(e.Message);
  231. IwbHubContext.Clients.Group(ClientId).getMqttMsg(new { topic = e.Topic, msg });
  232. if (e.Topic == ClientId || e.Topic == $"{ClientId}/Heartbeat")
  233. {
  234. return;
  235. }
  236. ReceiveMsgHandler(msg);
  237. }
  238. //private IMqttApplicationMessageReceivedHandler ReceivedHandler =>
  239. // new MqttApplicationMessageReceivedHandlerDelegate(
  240. // (arg) =>
  241. // {
  242. // string payload = System.Text.Encoding.UTF8.GetString(arg.ApplicationMessage.Payload);
  243. // var message = payload.Str2Obj<WeMessage>();
  244. // if (message != null)
  245. // {
  246. // switch (message.MsgType)
  247. // {
  248. // case MessageType.Environment:
  249. // break;
  250. // case MessageType.RunningInfo:
  251. // ReceiveRunningInfo(message);
  252. // break;
  253. // case MessageType.RoundScore:
  254. // ReceiveRoundScore(message);
  255. // break;
  256. // case MessageType.CommonMessage:
  257. // break;
  258. // case MessageType.GuideInfo:
  259. // break;
  260. // }
  261. // }
  262. // else
  263. // {
  264. // typeof(WeAppMsgClientManager).LogError("Message ERROR:" + payload);
  265. // }
  266. // });
  267. //public static readonly List<string> StartGroupNos = new List<string>();
  268. #endregion MSG-Client
  269. [UnitOfWork]
  270. protected virtual void ReceiveStart(WeMessage message)
  271. {
  272. var groupNo = message.RunningId;
  273. var group = GroupRepository.GetAllIncluding(a => a.CampInfo).FirstOrDefault(a => a.Id == groupNo);
  274. if (group != null)
  275. {
  276. var date = DateTime.Now;
  277. group.CampGroupState = CampGroupStateDefinition.Run;
  278. group.StartDate = date;
  279. GroupRepository.Update(group);
  280. UnitOfWorkManager.Current.SaveChanges();
  281. if (group.CampInfo.CampState != CampStateDefinition.Run)
  282. {
  283. group.CampInfo.CampState = CampStateDefinition.Run;
  284. group.CampInfo.StartDate = date;
  285. CampRepository.Update(group.CampInfo);
  286. UnitOfWorkManager.Current.SaveChanges();
  287. IwbHubContext.Clients.Group(group.CampNo).getReloadSpec(new { group.CampNo }.Obj2String());
  288. }
  289. ReloadPage(group.CampNo, groupNo);
  290. ScenePusher scenePusher = new ScenePusher();
  291. scenePusher.SendMsg += (msg) => { PushMessage(msg, groupNo); };
  292. _scenePushes[groupNo] = scenePusher;
  293. }
  294. }
  295. /// <summary>
  296. /// 刷新前台页面
  297. /// </summary>
  298. /// <param name="campNo"></param>
  299. /// <param name="no"></param>
  300. private void ReloadPage(string campNo, string no)
  301. {
  302. IwbHubContext.Clients.Group(campNo).getReloadStu(new { no }.Obj2String());
  303. IwbHubContext.Clients.Group(campNo).getReloadLeader(new { no }.Obj2String());
  304. IwbHubContext.Clients.Group(campNo).getReloadPublic(new { no }.Obj2String());
  305. }
  306. [UnitOfWork]
  307. protected virtual void ReceiveEnd(WeMessage message)
  308. {
  309. var groupNo = message.RunningId;
  310. //var group = GroupRepository.GetAllIncluding(a=>a.CampInfo).FirstOrDefault(a => a.Id == groupNo);
  311. //if (group != null)
  312. //{
  313. // var date = DateTime.Now;
  314. // this.LogDebug($"培训营分组【{groupNo}】结束");
  315. // group.CampGroupState = CampGroupStateDefinition.End;
  316. // group.EngDate = date;
  317. // group.TrainingMinute = Convert.ToDateTime(group.StartDate).GetTimeSpanMinute(date);
  318. // GroupRepository.Update(group);
  319. // UnitOfWorkManager.Current.SaveChanges();
  320. // var count = GroupRepository.Count(a => a.CampGroupState != CampGroupStateDefinition.End && a.CampNo == group.CampNo);
  321. // if (count == 0)
  322. // {
  323. // this.LogDebug($"培训营【{group.CampNo}】结束");
  324. // var camp = CampRepository.FirstOrDefault(a => a.Id == group.CampNo);
  325. // if (camp != null)
  326. // {
  327. // camp.CampState = CampStateDefinition.End;
  328. // camp.EngDate = date;
  329. // camp.TrainingMinute = Convert.ToDateTime(group.CampInfo.StartDate).GetTimeSpanMinute(date);
  330. // CampRepository.Update(camp);
  331. // UnitOfWorkManager.Current.SaveChanges();
  332. // }
  333. // }
  334. // StartGroupNos.Remove(groupNo);
  335. //}
  336. StopPushScene(groupNo);
  337. }
  338. [UnitOfWork]
  339. protected virtual void ReceiveRunningInfo(WeMessage message)
  340. {
  341. var groupNo = message.RunningId;
  342. // var runningInfo = message.Content.Str2Obj<RunningInfo>();
  343. var runningInfo = GetRunningInfo(groupNo);
  344. if (runningInfo != null)
  345. {
  346. var group = GroupRepository.FirstOrDefault(a => a.Id == groupNo);
  347. if (group != null)
  348. {
  349. if (group.RoundIndex != runningInfo.CurrentRoundIndex)
  350. {
  351. IwbHubContext.Clients.Group(group.CampNo).getReloadLeader(new { no = groupNo }.Obj2String());
  352. }
  353. runningInfo.Name = group.Name;
  354. CacheManager.GetCache(IwbCacheNames.GroupRunningInfoCache).Set(groupNo, runningInfo);
  355. group.RunningInfo = runningInfo.Obj2String();
  356. group.RoundIndex = runningInfo.CurrentRoundIndex;
  357. GroupRepository.Update(group);
  358. UnitOfWorkManager.Current.SaveChanges();
  359. IwbHubContext.Clients.Group(group.CampNo).getRunningChange(new { no = groupNo }.Obj2String());
  360. }
  361. }
  362. }
  363. private PackageDataNode GetRunningInfo(string no)
  364. {
  365. var url =
  366. $"{_engineUrl.Ew("/")}api/services/Engine/Run/QueryPackageDataNode?id={no}";
  367. var result = url.RequestPost("");
  368. var info = result.Str2Obj<PackageDataNode>();
  369. return info;
  370. }
  371. [UnitOfWork]
  372. protected virtual void ReceiveRoundScore(WeMessage message)
  373. {
  374. var groupNo = message.RunningId;
  375. var roundScoreInfo = message.Content.Str2Obj<RoundScoreInfo>();
  376. if (roundScoreInfo == null)
  377. {
  378. return;
  379. }
  380. var group = GroupRepository.FirstOrDefault(a => a.Id == groupNo);
  381. if (group == null)
  382. {
  383. return;
  384. }
  385. //var gs = await GsRepository.FirstOrDefaultAsync(a =>
  386. // a.GroupNo == groupNo && a.RoundIndex == roundScoreInfo.RoundIndex);
  387. var gs = CacheManager.GetGroupRoundScore(groupNo, roundScoreInfo.RoundIndex, GsRepository).Result;
  388. List<TagScoreInfo> tagScores = new List<TagScoreInfo>(), pushScores = new List<TagScoreInfo>(),
  389. oldTagScores = gs?.BehaviorTagScoreInfo.Str2Obj<List<TagScoreInfo>>();
  390. var activeTag = CacheManager.GetCampTags(group.CampNo, CampRepository).Result;
  391. if (roundScoreInfo.TagScores != null)
  392. {
  393. foreach (var tNo in activeTag)
  394. {
  395. var tagScore = roundScoreInfo.TagScores.FirstOrDefault(a => a.TagNo.Trim() == tNo.Trim());
  396. if (tagScore != null)
  397. {
  398. pushScores.Add(new TagScoreInfo()
  399. {
  400. TagNo = tNo,
  401. SystemScore = tagScore.SystemScore,
  402. TotalScore = tagScore.TotalScore
  403. });
  404. var oldTagScore = oldTagScores?.FirstOrDefault(a => a.TagNo.Trim() == tagScore.TagNo.Trim());
  405. if (oldTagScore != null)
  406. {
  407. tagScore.SystemScore = oldTagScore.SystemScore + tagScore.SystemScore;
  408. tagScore.CorrectionScore = oldTagScore.CorrectionScore == 0
  409. ? 0
  410. : oldTagScore.CorrectionScore + tagScore.SystemScore;
  411. tagScore.SystemScore = tagScore.SystemScore > tagScore.TotalScore
  412. ? tagScore.TotalScore
  413. : tagScore.SystemScore;
  414. }
  415. }
  416. else
  417. {
  418. tagScore = oldTagScores?.FirstOrDefault(a => a.TagNo.Trim() == tNo.Trim()) ?? new TagScoreInfo()
  419. {
  420. TagNo = tNo,
  421. CorrectionScore = 0,
  422. SystemScore = 0,
  423. TotalScore = 0
  424. };
  425. }
  426. tagScores.Add(tagScore);
  427. }
  428. }
  429. if (roundScoreInfo.KeyWords.IsNotEmpty())
  430. {
  431. var arr = roundScoreInfo.KeyWords.Split('|');
  432. if (int.TryParse(arr[0], out var logId))
  433. {
  434. var log = GlRepository.FirstOrDefault(a => a.Id == logId);
  435. if (log != null)
  436. {
  437. log.LogState = LogStateDefinition.HasMatch;
  438. GlRepository.Update(log);
  439. }
  440. }
  441. }
  442. if (gs == null)
  443. {
  444. gs = new GroupScoreInfo()
  445. {
  446. CampNo = group.CampNo,
  447. GroupNo = groupNo,
  448. RoundIndex = roundScoreInfo.RoundIndex,
  449. SystemScore = roundScoreInfo.RoundScore,
  450. BehaviorTagScoreInfo = tagScores.Obj2StringCamelCase()
  451. };
  452. GsRepository.Insert(gs);
  453. }
  454. else
  455. {
  456. gs.CampGroupInfo = null;
  457. gs.SystemScore = roundScoreInfo.RoundScore;
  458. gs.BehaviorTagScoreInfo = tagScores.Obj2StringCamelCase();
  459. GsRepository.Update(gs);
  460. }
  461. CacheManager.GetCache(IwbCacheNames.GroupRunningInfoCache)
  462. .Set($"SCORE-{groupNo}-{roundScoreInfo.RoundIndex}", gs);
  463. IwbHubContext.Clients.Group(group.CampNo)
  464. .getRoundScore(new
  465. {
  466. no = groupNo,
  467. round = roundScoreInfo.RoundIndex,
  468. systemScore = roundScoreInfo.RoundScore,
  469. tagScores = pushScores
  470. }.Obj2StringCamelCase());
  471. }
  472. [UnitOfWork]
  473. protected virtual void ReceiveScene(WeMessage message)
  474. {
  475. var groupNo = message.RunningId;
  476. var scene = message.Content.Str2Obj<SceneDto>();
  477. if (scene != null)
  478. {
  479. var group = GroupRepository.FirstOrDefault(a => a.Id == groupNo);
  480. if (group != null)
  481. {
  482. var sceneNoDto = CacheManager.GetSceneNos(groupNo, GroupRepository).Result;
  483. sceneNoDto.hasChange = true;
  484. sceneNoDto.PathList = sceneNoDto.PathList ?? new List<string>();
  485. if (!sceneNoDto.PathList.Contains(scene.Path))
  486. {
  487. sceneNoDto.PathList.Add(scene.Path);
  488. }
  489. CacheManager.GetCache(IwbCacheNames.SceneInfoCache).Set($"SceneNos-{groupNo}", sceneNoDto);
  490. //IwbHubContext.Clients.Group(group.CampNo).getNewScene(new { no = groupNo, sceneNo = scene.No }.Obj2String());
  491. //ScenePusher scenePusher;
  492. //if (_scenePushes.ContainsKey(groupNo))
  493. //{
  494. // scenePusher = _scenePushes[groupNo];
  495. //}
  496. //else
  497. //{
  498. // scenePusher = new ScenePusher();
  499. // scenePusher.SendMsg += (msg) => { PushMessage(msg, groupNo); };
  500. //}
  501. //scenePusher.Push(new ScenePushMessage(groupNo, scene.Path));
  502. //_scenePushes[groupNo] = scenePusher;
  503. SendScenePusher(groupNo, groupNo, new ScenePushMessage(groupNo, scene.Path));
  504. }
  505. }
  506. }
  507. [UnitOfWork]
  508. protected virtual void ReceiveGuide(WeMessage message)
  509. {
  510. var groupNo = message.RunningId;
  511. var group = GroupRepository.FirstOrDefault(a => a.Id == groupNo);
  512. if (group == null)
  513. {
  514. return;
  515. }
  516. //ScenePusher scenePusher;
  517. //if (_scenePushes.ContainsKey(groupNo))
  518. //{
  519. // scenePusher = _scenePushes[groupNo];
  520. //}
  521. //else
  522. //{
  523. // scenePusher = new ScenePusher();
  524. // _scenePushes[groupNo] = scenePusher;
  525. // scenePusher.SendMsg += (msg) => { PushMessage(msg, groupNo); };
  526. //}
  527. //scenePusher.Push(new ScenePushMessage(PushMessageDefinition.Guide) { content = message.Content });
  528. //IwbHubContext.Clients.Group(groupNo).getGuide(message.Content);
  529. SendScenePusher(groupNo, groupNo, new ScenePushMessage(PushMessageDefinition.Guide) { content = message.Content });
  530. }
  531. [UnitOfWork]
  532. protected virtual void ReceiveEnvironment(WeMessage message)
  533. {
  534. var groupNo = message.RunningId;
  535. var group = GroupRepository.FirstOrDefault(a => a.Id == groupNo);
  536. if (group == null)
  537. {
  538. return;
  539. }
  540. //ScenePusher scenePusher;
  541. //if (_scenePushes.ContainsKey(groupNo))
  542. //{
  543. // scenePusher = _scenePushes[groupNo];
  544. //}
  545. //else
  546. //{
  547. // scenePusher = new ScenePusher();
  548. // _scenePushes[groupNo] = scenePusher;
  549. // scenePusher.SendMsg += (msg) => { PushMessage(msg, groupNo); };
  550. //}
  551. //scenePusher.Push(new ScenePushMessage(PushMessageDefinition.Environment) { content = message.Content });
  552. SendScenePusher(groupNo, groupNo, new ScenePushMessage(PushMessageDefinition.Environment) { content = message.Content });
  553. }
  554. [UnitOfWork]
  555. protected virtual void ReceiveMatchSuccess(WeMessage message)
  556. {
  557. var groupNo = message.RunningId;
  558. var group = GroupRepository.FirstOrDefault(a => a.Id == groupNo);
  559. if (group == null)
  560. {
  561. return;
  562. }
  563. IwbHubContext.Clients.Group(groupNo).getMatchSuccess(message.Content);
  564. }
  565. [UnitOfWork]
  566. protected virtual void ReceiveCommonMsg(WeMessage message)
  567. {
  568. var groupNo = message.RunningId;
  569. var group = GroupRepository.FirstOrDefault(a => a.Id == groupNo);
  570. if (group == null)
  571. {
  572. return;
  573. }
  574. //ScenePusher scenePusher;
  575. //if (_scenePushes.ContainsKey(groupNo))
  576. //{
  577. // scenePusher = _scenePushes[groupNo];
  578. //}
  579. //else
  580. //{
  581. // scenePusher = new ScenePusher();
  582. // _scenePushes[groupNo] = scenePusher;
  583. // scenePusher.SendMsg += (msg) => { PushMessage(msg, groupNo); };
  584. //}
  585. //scenePusher.Push(new ScenePushMessage(PushMessageDefinition.CommonMsg) { content = message.Content });
  586. SendScenePusher(groupNo, groupNo, new ScenePushMessage(PushMessageDefinition.CommonMsg) { content = message.Content });
  587. }
  588. /// <summary>
  589. /// 开始推送情景(解决页面还未加载时就推送情景)
  590. /// 需要页面第一次加载打开推送开关后再开始推送
  591. /// </summary>
  592. /// <param name="groupNo"></param>
  593. public static bool StartPushScene(string groupNo)
  594. {
  595. ScenePusher scenePusher = _scenePushes.ContainsKey(groupNo) ? _scenePushes[groupNo] : new ScenePusher();
  596. _scenePushes[groupNo] = scenePusher;
  597. return scenePusher.Start();
  598. }
  599. public static void StopPushScene(string no)
  600. {
  601. if (_scenePushes.ContainsKey(no))
  602. {
  603. _scenePushes[no].Stop();
  604. }
  605. }
  606. private void SendScenePusher(string no, string code, ScenePushMessage pushMsg)
  607. {
  608. ScenePusher scenePusher;
  609. if (_scenePushes.ContainsKey(no))
  610. {
  611. scenePusher = _scenePushes[no];
  612. if (scenePusher.NeedHandel)
  613. {
  614. scenePusher.SendMsg += (msg) => { PushMessage(msg, code); };
  615. }
  616. }
  617. else
  618. {
  619. scenePusher = new ScenePusher();
  620. scenePusher.SendMsg += (msg) => { PushMessage(msg, code); };
  621. _scenePushes[no] = scenePusher;
  622. }
  623. scenePusher.Push(pushMsg);
  624. }
  625. private void PushMessage(ScenePushMessage msg, string code)
  626. {
  627. switch (msg.type)
  628. {
  629. case PushMessageDefinition.Scene:
  630. IwbHubContext.Clients.Group(code).getNewScene(msg);
  631. break;
  632. case PushMessageDefinition.Guide:
  633. IwbHubContext.Clients.Group(code).getGuide(msg.content);
  634. break;
  635. case PushMessageDefinition.Environment:
  636. IwbHubContext.Clients.Group(code).getEnvironment(msg.content);
  637. break;
  638. case PushMessageDefinition.CommonMsg:
  639. IwbHubContext.Clients.Group(code).getCommonMsg(msg.content);
  640. break;
  641. }
  642. }
  643. }
  644. }