WeAppMsgClientManager.cs 27 KB

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