WeAppMsgClientManager.cs 27 KB

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