WeAppMsgClientManager.cs 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697
  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 = "localhost",
  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. Client.SetOptions(result.ServerIp, result.ServerPort, ClientId, result.Name, result.SecretKey);
  95. Client.SetReceivedHandler(ReceivedHandler);
  96. Subscribe();
  97. }
  98. private void Subscribe()
  99. {
  100. if (Client.CheckClient())
  101. {
  102. Client.SubscribeTopic(ClientId, false);
  103. IwbHubContext.Clients.Group(ClientId).getMqttMsg(new { topic = ClientId, msg = "订阅主题" });
  104. Client.SubscribeTopic("Heartbeat");
  105. IwbHubContext.Clients.Group(ClientId).getMqttMsg(new { topic = $"{ClientId}/Heartbeat", msg = "订阅主题" });
  106. var t = typeof(MessageType);
  107. var fts = t.GetFields(BindingFlags.Static | BindingFlags.Public);
  108. foreach (var f in fts)
  109. {
  110. string name = f.Name;
  111. Client.SubscribeTopic($"{name}/+");
  112. IwbHubContext.Clients.Group(ClientId).getMqttMsg(new { topic = $"{ClientId}/{name}/+", msg = "订阅主题" });
  113. //AsyncHelper.RunSync(() => Client.SubscribeTopic(name));
  114. }
  115. }
  116. }
  117. public void SendMessage(WeMessage message, MessageType type, string clientId = null)
  118. {
  119. if (Client.NotValidate)
  120. {
  121. RegisterClient();
  122. }
  123. var msg = message.Obj2String();
  124. Client.SendMsg(type.ToString(), msg, clientId);
  125. IwbHubContext.Clients.Group(ClientId).getSendMqttMsg(new { topic = $"{ClientId}/{type}/", msg });
  126. }
  127. public void SendMessage(WeMessage message)
  128. {
  129. if (Client.NotValidate)
  130. {
  131. RegisterClient();
  132. }
  133. var msg = message.Obj2String();
  134. Client.SendMsg(message.Type.ToString(), msg, message.TargetClientId);
  135. IwbHubContext.Clients.Group(ClientId).getSendMqttMsg(new { topic = $"{message.TargetClientId}/{message.Type}/", msg });
  136. }
  137. public void SendMessage(string msg)
  138. {
  139. if (Client.NotValidate)
  140. {
  141. RegisterClient();
  142. }
  143. Client.SendMessage(ClientId, msg);
  144. IwbHubContext.Clients.Group(ClientId).getSendMqttMsg(new { topic = $"{ClientId}", msg });
  145. }
  146. public void SendMessage(string topic, string msg)
  147. {
  148. if (Client.NotValidate)
  149. {
  150. RegisterClient();
  151. }
  152. Client.SendMessage(topic, msg);
  153. IwbHubContext.Clients.Group(ClientId).getSendMqttMsg(new { topic, msg });
  154. }
  155. /// <summary>
  156. /// 消息接受回调处理
  157. /// </summary>
  158. /// <param name="msg"></param>
  159. private void ReceiveMsgHandler(string msg)
  160. {
  161. try
  162. {
  163. var message = msg.Str2Obj<WeMessage>();
  164. if (message != null)
  165. {
  166. switch (message.Type)
  167. {
  168. case MessageType.Start:
  169. ReceiveStart(message);
  170. break;
  171. case MessageType.End:
  172. ReceiveEnd(message);
  173. break;
  174. case MessageType.RunningInfo:
  175. ReceiveRunningInfo(message);
  176. break;
  177. case MessageType.RoundScore:
  178. ReceiveRoundScore(message);
  179. break;
  180. case MessageType.SceneInfo:
  181. ReceiveScene(message);
  182. break;
  183. case MessageType.GuideInfo:
  184. ReceiveGuide(message);
  185. break;
  186. case MessageType.Environment:
  187. ReceiveEnvironment(message);
  188. break;
  189. case MessageType.CommandMatchSuccess:
  190. ReceiveMatchSuccess(message);
  191. break;
  192. case MessageType.CommonMessage:
  193. ReceiveCommonMsg(message);
  194. break;
  195. }
  196. }
  197. else
  198. {
  199. typeof(WeAppMsgClientManager).LogError("MSG ERROR:" + msg);
  200. }
  201. }
  202. catch (Exception e)
  203. {
  204. typeof(WeAppMsgClientManager).LogError(e);
  205. }
  206. }
  207. /// <summary>
  208. /// 消息接受回调处理
  209. /// </summary>
  210. /// <param name="sender"></param>
  211. /// <param name="e"></param>
  212. private void ReceivedHandler(object sender, MqttMsgPublishEventArgs e)
  213. {
  214. string msg = System.Text.Encoding.UTF8.GetString(e.Message);
  215. IwbHubContext.Clients.Group(ClientId).getMqttMsg(new { topic = e.Topic, msg });
  216. if (e.Topic == ClientId || e.Topic == $"{ClientId}/Heartbeat")
  217. {
  218. return;
  219. }
  220. ReceiveMsgHandler(msg);
  221. }
  222. //private IMqttApplicationMessageReceivedHandler ReceivedHandler =>
  223. // new MqttApplicationMessageReceivedHandlerDelegate(
  224. // (arg) =>
  225. // {
  226. // string payload = System.Text.Encoding.UTF8.GetString(arg.ApplicationMessage.Payload);
  227. // var message = payload.Str2Obj<WeMessage>();
  228. // if (message != null)
  229. // {
  230. // switch (message.MsgType)
  231. // {
  232. // case MessageType.Environment:
  233. // break;
  234. // case MessageType.RunningInfo:
  235. // ReceiveRunningInfo(message);
  236. // break;
  237. // case MessageType.RoundScore:
  238. // ReceiveRoundScore(message);
  239. // break;
  240. // case MessageType.CommonMessage:
  241. // break;
  242. // case MessageType.GuideInfo:
  243. // break;
  244. // }
  245. // }
  246. // else
  247. // {
  248. // typeof(WeAppMsgClientManager).LogError("Message ERROR:" + payload);
  249. // }
  250. // });
  251. //public static readonly List<string> StartGroupNos = new List<string>();
  252. #endregion MSG-Client
  253. [UnitOfWork]
  254. protected virtual void ReceiveStart(WeMessage message)
  255. {
  256. var groupNo = message.RunningId;
  257. var group = GroupRepository.GetAllIncluding(a => a.CampInfo).FirstOrDefault(a => a.Id == groupNo);
  258. if (group != null)
  259. {
  260. var date = DateTime.Now;
  261. group.CampGroupState = CampGroupStateDefinition.Run;
  262. group.StartDate = date;
  263. GroupRepository.Update(group);
  264. UnitOfWorkManager.Current.SaveChanges();
  265. if (group.CampInfo.CampState != CampStateDefinition.Run)
  266. {
  267. group.CampInfo.CampState = CampStateDefinition.Run;
  268. group.CampInfo.StartDate = date;
  269. CampRepository.Update(group.CampInfo);
  270. UnitOfWorkManager.Current.SaveChanges();
  271. IwbHubContext.Clients.Group(group.CampNo).getReloadSpec(new { group.CampNo }.Obj2String());
  272. }
  273. ReloadPage(group.CampNo, groupNo);
  274. ScenePusher scenePusher = new ScenePusher();
  275. scenePusher.SendMsg += (msg) => { PushMessage(msg, groupNo); };
  276. _scenePushes[groupNo] = scenePusher;
  277. }
  278. }
  279. /// <summary>
  280. /// 刷新前台页面
  281. /// </summary>
  282. /// <param name="campNo"></param>
  283. /// <param name="no"></param>
  284. private void ReloadPage(string campNo, string no)
  285. {
  286. IwbHubContext.Clients.Group(campNo).getReloadStu(new { no }.Obj2String());
  287. IwbHubContext.Clients.Group(campNo).getReloadLeader(new { no }.Obj2String());
  288. IwbHubContext.Clients.Group(campNo).getReloadPublic(new { no }.Obj2String());
  289. }
  290. [UnitOfWork]
  291. protected virtual void ReceiveEnd(WeMessage message)
  292. {
  293. var groupNo = message.RunningId;
  294. //var group = GroupRepository.GetAllIncluding(a=>a.CampInfo).FirstOrDefault(a => a.Id == groupNo);
  295. //if (group != null)
  296. //{
  297. // var date = DateTime.Now;
  298. // this.LogDebug($"培训营分组【{groupNo}】结束");
  299. // group.CampGroupState = CampGroupStateDefinition.End;
  300. // group.EngDate = date;
  301. // group.TrainingMinute = Convert.ToDateTime(group.StartDate).GetTimeSpanMinute(date);
  302. // GroupRepository.Update(group);
  303. // UnitOfWorkManager.Current.SaveChanges();
  304. // var count = GroupRepository.Count(a => a.CampGroupState != CampGroupStateDefinition.End && a.CampNo == group.CampNo);
  305. // if (count == 0)
  306. // {
  307. // this.LogDebug($"培训营【{group.CampNo}】结束");
  308. // var camp = CampRepository.FirstOrDefault(a => a.Id == group.CampNo);
  309. // if (camp != null)
  310. // {
  311. // camp.CampState = CampStateDefinition.End;
  312. // camp.EngDate = date;
  313. // camp.TrainingMinute = Convert.ToDateTime(group.CampInfo.StartDate).GetTimeSpanMinute(date);
  314. // CampRepository.Update(camp);
  315. // UnitOfWorkManager.Current.SaveChanges();
  316. // }
  317. // }
  318. // StartGroupNos.Remove(groupNo);
  319. //}
  320. StopPushScene(groupNo);
  321. }
  322. [UnitOfWork]
  323. protected virtual void ReceiveRunningInfo(WeMessage message)
  324. {
  325. var groupNo = message.RunningId;
  326. // var runningInfo = message.Content.Str2Obj<RunningInfo>();
  327. var runningInfo = GetRunningInfo(groupNo);
  328. if (runningInfo != null)
  329. {
  330. var group = GroupRepository.FirstOrDefault(a => a.Id == groupNo);
  331. if (group != null)
  332. {
  333. if (group.RoundIndex != runningInfo.CurrentRoundIndex)
  334. {
  335. IwbHubContext.Clients.Group(group.CampNo).getReloadLeader(new { no = groupNo }.Obj2String());
  336. }
  337. runningInfo.Name = group.Name;
  338. CacheManager.GetCache(IwbCacheNames.GroupRunningInfoCache).Set(groupNo, runningInfo);
  339. group.RunningInfo = runningInfo.Obj2String();
  340. group.RoundIndex = runningInfo.CurrentRoundIndex;
  341. GroupRepository.Update(group);
  342. UnitOfWorkManager.Current.SaveChanges();
  343. IwbHubContext.Clients.Group(group.CampNo).getRunningChange(new { no = groupNo }.Obj2String());
  344. }
  345. }
  346. }
  347. private PackageDataNode GetRunningInfo(string no)
  348. {
  349. var url =
  350. $"{_engineUrl.Ew("/")}api/services/Engine/Run/QueryPackageDataNode?id={no}";
  351. var result = url.RequestPost("");
  352. var info = result.Str2Obj<PackageDataNode>();
  353. return info;
  354. }
  355. [UnitOfWork]
  356. protected virtual void ReceiveRoundScore(WeMessage message)
  357. {
  358. var groupNo = message.RunningId;
  359. var roundScoreInfo = message.Content.Str2Obj<RoundScoreInfo>();
  360. if (roundScoreInfo == null)
  361. {
  362. return;
  363. }
  364. var group = GroupRepository.FirstOrDefault(a => a.Id == groupNo);
  365. if (group == null)
  366. {
  367. return;
  368. }
  369. //var gs = await GsRepository.FirstOrDefaultAsync(a =>
  370. // a.GroupNo == groupNo && a.RoundIndex == roundScoreInfo.RoundIndex);
  371. var gs = CacheManager.GetGroupRoundScore(groupNo, roundScoreInfo.RoundIndex, GsRepository).Result;
  372. List<TagScoreInfo> tagScores = new List<TagScoreInfo>(), pushScores = new List<TagScoreInfo>(),
  373. oldTagScores = gs?.BehaviorTagScoreInfo.Str2Obj<List<TagScoreInfo>>();
  374. var activeTag = CacheManager.GetCampTags(group.CampNo, CampRepository).Result;
  375. if (roundScoreInfo.TagScores != null)
  376. {
  377. foreach (var tNo in activeTag)
  378. {
  379. var tagScore = roundScoreInfo.TagScores.FirstOrDefault(a => a.TagNo.Trim() == tNo.Trim());
  380. if (tagScore != null)
  381. {
  382. pushScores.Add(new TagScoreInfo()
  383. {
  384. TagNo = tNo,
  385. SystemScore = tagScore.SystemScore,
  386. TotalScore = tagScore.TotalScore
  387. });
  388. var oldTagScore = oldTagScores?.FirstOrDefault(a => a.TagNo.Trim() == tagScore.TagNo.Trim());
  389. if (oldTagScore != null)
  390. {
  391. tagScore.SystemScore = oldTagScore.SystemScore + tagScore.SystemScore;
  392. tagScore.CorrectionScore = oldTagScore.CorrectionScore == 0
  393. ? 0
  394. : oldTagScore.CorrectionScore + tagScore.SystemScore;
  395. tagScore.SystemScore = tagScore.SystemScore > tagScore.TotalScore
  396. ? tagScore.TotalScore
  397. : tagScore.SystemScore;
  398. }
  399. }
  400. else
  401. {
  402. tagScore = oldTagScores?.FirstOrDefault(a => a.TagNo.Trim() == tNo.Trim()) ?? new TagScoreInfo()
  403. {
  404. TagNo = tNo,
  405. CorrectionScore = 0,
  406. SystemScore = 0,
  407. TotalScore = 0
  408. };
  409. }
  410. tagScores.Add(tagScore);
  411. }
  412. }
  413. if (roundScoreInfo.KeyWords.IsNotEmpty())
  414. {
  415. var arr = roundScoreInfo.KeyWords.Split('|');
  416. if (int.TryParse(arr[0], out var logId))
  417. {
  418. var log = GlRepository.FirstOrDefault(a => a.Id == logId);
  419. if (log != null)
  420. {
  421. log.LogState = LogStateDefinition.HasMatch;
  422. GlRepository.Update(log);
  423. }
  424. }
  425. }
  426. if (gs == null)
  427. {
  428. gs = new GroupScoreInfo()
  429. {
  430. CampNo = group.CampNo,
  431. GroupNo = groupNo,
  432. RoundIndex = roundScoreInfo.RoundIndex,
  433. SystemScore = roundScoreInfo.RoundScore,
  434. BehaviorTagScoreInfo = tagScores.Obj2StringCamelCase()
  435. };
  436. GsRepository.Insert(gs);
  437. }
  438. else
  439. {
  440. gs.CampGroupInfo = null;
  441. gs.SystemScore = roundScoreInfo.RoundScore;
  442. gs.BehaviorTagScoreInfo = tagScores.Obj2StringCamelCase();
  443. GsRepository.Update(gs);
  444. }
  445. CacheManager.GetCache(IwbCacheNames.GroupRunningInfoCache)
  446. .Set($"SCORE-{groupNo}-{roundScoreInfo.RoundIndex}", gs);
  447. IwbHubContext.Clients.Group(group.CampNo)
  448. .getRoundScore(new
  449. {
  450. no = groupNo,
  451. round = roundScoreInfo.RoundIndex,
  452. systemScore = roundScoreInfo.RoundScore,
  453. tagScores = pushScores
  454. }.Obj2StringCamelCase());
  455. }
  456. [UnitOfWork]
  457. protected virtual void ReceiveScene(WeMessage message)
  458. {
  459. var groupNo = message.RunningId;
  460. var scene = message.Content.Str2Obj<SceneDto>();
  461. if (scene != null)
  462. {
  463. var group = GroupRepository.FirstOrDefault(a => a.Id == groupNo);
  464. if (group != null)
  465. {
  466. var sceneNoDto = CacheManager.GetSceneNos(groupNo, GroupRepository).Result;
  467. sceneNoDto.hasChange = true;
  468. sceneNoDto.PathList = sceneNoDto.PathList ?? new List<string>();
  469. if (!sceneNoDto.PathList.Contains(scene.Path))
  470. {
  471. sceneNoDto.PathList.Add(scene.Path);
  472. }
  473. CacheManager.GetCache(IwbCacheNames.SceneInfoCache).Set($"SceneNos-{groupNo}", sceneNoDto);
  474. //IwbHubContext.Clients.Group(group.CampNo).getNewScene(new { no = groupNo, sceneNo = scene.No }.Obj2String());
  475. //ScenePusher scenePusher;
  476. //if (_scenePushes.ContainsKey(groupNo))
  477. //{
  478. // scenePusher = _scenePushes[groupNo];
  479. //}
  480. //else
  481. //{
  482. // scenePusher = new ScenePusher();
  483. // scenePusher.SendMsg += (msg) => { PushMessage(msg, groupNo); };
  484. //}
  485. //scenePusher.Push(new ScenePushMessage(groupNo, scene.Path));
  486. //_scenePushes[groupNo] = scenePusher;
  487. SendScenePusher(groupNo, groupNo, new ScenePushMessage(groupNo, scene.Path));
  488. }
  489. }
  490. }
  491. [UnitOfWork]
  492. protected virtual void ReceiveGuide(WeMessage message)
  493. {
  494. var groupNo = message.RunningId;
  495. var group = GroupRepository.FirstOrDefault(a => a.Id == groupNo);
  496. if (group == null)
  497. {
  498. return;
  499. }
  500. //ScenePusher scenePusher;
  501. //if (_scenePushes.ContainsKey(groupNo))
  502. //{
  503. // scenePusher = _scenePushes[groupNo];
  504. //}
  505. //else
  506. //{
  507. // scenePusher = new ScenePusher();
  508. // _scenePushes[groupNo] = scenePusher;
  509. // scenePusher.SendMsg += (msg) => { PushMessage(msg, groupNo); };
  510. //}
  511. //scenePusher.Push(new ScenePushMessage(PushMessageDefinition.Guide) { content = message.Content });
  512. //IwbHubContext.Clients.Group(groupNo).getGuide(message.Content);
  513. SendScenePusher(groupNo, groupNo, new ScenePushMessage(PushMessageDefinition.Guide) { content = message.Content });
  514. }
  515. [UnitOfWork]
  516. protected virtual void ReceiveEnvironment(WeMessage message)
  517. {
  518. var groupNo = message.RunningId;
  519. var group = GroupRepository.FirstOrDefault(a => a.Id == groupNo);
  520. if (group == null)
  521. {
  522. return;
  523. }
  524. //ScenePusher scenePusher;
  525. //if (_scenePushes.ContainsKey(groupNo))
  526. //{
  527. // scenePusher = _scenePushes[groupNo];
  528. //}
  529. //else
  530. //{
  531. // scenePusher = new ScenePusher();
  532. // _scenePushes[groupNo] = scenePusher;
  533. // scenePusher.SendMsg += (msg) => { PushMessage(msg, groupNo); };
  534. //}
  535. //scenePusher.Push(new ScenePushMessage(PushMessageDefinition.Environment) { content = message.Content });
  536. SendScenePusher(groupNo, groupNo, new ScenePushMessage(PushMessageDefinition.Environment) { content = message.Content });
  537. }
  538. [UnitOfWork]
  539. protected virtual void ReceiveMatchSuccess(WeMessage message)
  540. {
  541. var groupNo = message.RunningId;
  542. var group = GroupRepository.FirstOrDefault(a => a.Id == groupNo);
  543. if (group == null)
  544. {
  545. return;
  546. }
  547. IwbHubContext.Clients.Group(groupNo).getMatchSuccess(message.Content);
  548. }
  549. [UnitOfWork]
  550. protected virtual void ReceiveCommonMsg(WeMessage message)
  551. {
  552. var groupNo = message.RunningId;
  553. var group = GroupRepository.FirstOrDefault(a => a.Id == groupNo);
  554. if (group == null)
  555. {
  556. return;
  557. }
  558. //ScenePusher scenePusher;
  559. //if (_scenePushes.ContainsKey(groupNo))
  560. //{
  561. // scenePusher = _scenePushes[groupNo];
  562. //}
  563. //else
  564. //{
  565. // scenePusher = new ScenePusher();
  566. // _scenePushes[groupNo] = scenePusher;
  567. // scenePusher.SendMsg += (msg) => { PushMessage(msg, groupNo); };
  568. //}
  569. //scenePusher.Push(new ScenePushMessage(PushMessageDefinition.CommonMsg) { content = message.Content });
  570. SendScenePusher(groupNo, groupNo, new ScenePushMessage(PushMessageDefinition.CommonMsg) { content = message.Content });
  571. }
  572. /// <summary>
  573. /// 开始推送情景(解决页面还未加载时就推送情景)
  574. /// 需要页面第一次加载打开推送开关后再开始推送
  575. /// </summary>
  576. /// <param name="groupNo"></param>
  577. public static bool StartPushScene(string groupNo)
  578. {
  579. ScenePusher scenePusher = _scenePushes.ContainsKey(groupNo) ? _scenePushes[groupNo] : new ScenePusher();
  580. _scenePushes[groupNo] = scenePusher;
  581. return scenePusher.Start();
  582. }
  583. public static void StopPushScene(string no)
  584. {
  585. if (_scenePushes.ContainsKey(no))
  586. {
  587. _scenePushes[no].Stop();
  588. }
  589. }
  590. private void SendScenePusher(string no, string code, ScenePushMessage pushMsg)
  591. {
  592. ScenePusher scenePusher;
  593. if (_scenePushes.ContainsKey(no))
  594. {
  595. scenePusher = _scenePushes[no];
  596. if (scenePusher.NeedHandel)
  597. {
  598. scenePusher.SendMsg += (msg) => { PushMessage(msg, code); };
  599. }
  600. }
  601. else
  602. {
  603. scenePusher = new ScenePusher();
  604. scenePusher.SendMsg += (msg) => { PushMessage(msg, code); };
  605. _scenePushes[no] = scenePusher;
  606. }
  607. scenePusher.Push(pushMsg);
  608. }
  609. private void PushMessage(ScenePushMessage msg, string code)
  610. {
  611. switch (msg.type)
  612. {
  613. case PushMessageDefinition.Scene:
  614. IwbHubContext.Clients.Group(code).getNewScene(msg);
  615. break;
  616. case PushMessageDefinition.Guide:
  617. IwbHubContext.Clients.Group(code).getGuide(msg.content);
  618. break;
  619. case PushMessageDefinition.Environment:
  620. IwbHubContext.Clients.Group(code).getEnvironment(msg.content);
  621. break;
  622. case PushMessageDefinition.CommonMsg:
  623. IwbHubContext.Clients.Group(code).getCommonMsg(msg.content);
  624. break;
  625. }
  626. }
  627. }
  628. }