QueryAppService.cs 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Data.Entity;
  4. using System.Linq;
  5. using System.Threading;
  6. using System.Threading.Tasks;
  7. using System.Web.Mvc;
  8. using Abp.Application.Services.Dto;
  9. using Abp.Auditing;
  10. using Abp.Authorization;
  11. using Abp.Configuration;
  12. using Abp.Domain.Repositories;
  13. using Abp.Runtime.Caching;
  14. using Abp.Web.Models;
  15. using IwbZero.AppServiceBase;
  16. using IwbZero.ToolCommon.LogHelpers;
  17. using IwbZero.ToolCommon.StringModel;
  18. using WeEngine.ModelInfo;
  19. using WeEngine.Packages;
  20. using WeOnlineApp.Authorization.Users;
  21. using WeOnlineApp.BaseInfo;
  22. using WeOnlineApp.BaseSystem.Query.Dto;
  23. using WeOnlineApp.BaseSystem.Users.Dto;
  24. using WeOnlineApp.Basic;
  25. using WeOnlineApp.Configuration;
  26. using WeOnlineApp.Configuration.Cache;
  27. using WeOnlineApp.TrainingCamp;
  28. using WeOnlineApp.TrainingCamp.Dto;
  29. using WeOnlineApp.TrainingCampPlay.Dto;
  30. #pragma warning disable CS4014
  31. namespace WeOnlineApp.BaseSystem.Query
  32. {
  33. [AllowAnonymous, DisableAuditing]
  34. public class QueryAppService : IwbAppServiceBase, IQueryAppService
  35. {
  36. #region 仓储
  37. public QueryAppService(
  38. IRepository<User, long> userRepository, IRepository<CampInfo, string> campRepository, IRepository<CampPlayInfo, string> playRepository, ICacheManager cacheManager, IRepository<CampPlayScoreInfo> psRepository, IRepository<CampPlayLogInfo> plRepository, IRepository<CampSceneMapInfo> sceneMapRepository, IRepository<SysAttachFile> attachRepository, IRepository<SubjectCategoryInfo, string> scRepository)
  39. {
  40. UserRepository = userRepository;
  41. CampRepository = campRepository;
  42. PlayRepository = playRepository;
  43. PsRepository = psRepository;
  44. PlRepository = plRepository;
  45. SceneMapRepository = sceneMapRepository;
  46. AttachRepository = attachRepository;
  47. ScRepository = scRepository;
  48. CacheManager = cacheManager;
  49. }
  50. private string DataCenterUrl => SettingManager.GetSettingValue(IwbSettingNames.WeDataCenterIp).Ew("/");
  51. protected IRepository<User, long> UserRepository { get; }
  52. protected IRepository<SubjectCategoryInfo, string> ScRepository { get; }
  53. protected IRepository<CampInfo, string> CampRepository { get; }
  54. protected IRepository<CampPlayInfo, string> PlayRepository { get; }
  55. protected IRepository<CampPlayScoreInfo> PsRepository { get; }
  56. protected IRepository<CampPlayLogInfo> PlRepository { get; }
  57. protected IRepository<CampSceneMapInfo> SceneMapRepository { get; }
  58. protected IRepository<SysAttachFile> AttachRepository { get; }
  59. #endregion 仓储
  60. #region SELECT
  61. #region 课程类别
  62. [DisableAuditing]
  63. public async Task<List<SelectListItem>> GetCategorySelectList()
  64. {
  65. var list = await ScRepository.GetAllListAsync(a => a.ParentNo != null);
  66. var sList = new List<SelectListItem> { new SelectListItem { Text = @"请选择课程类别...", Value = "", Selected = true } };
  67. foreach (var l in list)
  68. {
  69. sList.Add(new SelectListItem { Value = l.Id, Text = l.CategoryName });
  70. }
  71. return sList;
  72. }
  73. [DisableAuditing]
  74. public async Task<string> GetCategorySelectStr()
  75. {
  76. var list = await ScRepository.GetAllListAsync();
  77. string str = "";//"<option value=\"\" selected >请选择课程类别...</option>";
  78. var tempParentNo = list.FirstOrDefault(a => a.ParentNo == null)?.Id ?? "";
  79. foreach (var l in list)
  80. {
  81. var name = l.CategoryName;
  82. var parentNo = l.ParentNo;
  83. var id = l.Id;
  84. if (l.ParentNo == null)
  85. {
  86. parentNo = "0";
  87. id = "";
  88. name = "请选择课程类别";
  89. }
  90. else if (l.ParentNo == tempParentNo)
  91. {
  92. parentNo = "";
  93. }
  94. str += $"<option parent=\"{parentNo}\" value=\"{id}\">{name}</option>";
  95. }
  96. return str;
  97. }
  98. #endregion 课程类别
  99. #region 用户
  100. [DisableAuditing]
  101. public async Task<List<SelectListItem>> GetUserSelectList()
  102. {
  103. var list = await UserRepository.GetAllListAsync();
  104. var sList = new List<SelectListItem> { new SelectListItem { Text = @"请选择用户...", Value = "", Selected = true } };
  105. foreach (var l in list)
  106. {
  107. sList.Add(new SelectListItem { Value = l.Id + "", Text = l.Name });
  108. }
  109. return sList;
  110. }
  111. [DisableAuditing]
  112. public async Task<string> GetUserSelectStr()
  113. {
  114. var list = await UserRepository.GetAllListAsync();
  115. var str = "<option value=\"\" selected >请选择用户...</option>";
  116. foreach (var l in list)
  117. {
  118. str += $"<option value=\"{l.Id}\" >{l.Name}</option>";
  119. }
  120. return str;
  121. }
  122. //[DisableAuditing]
  123. //public async Task<string> GetCategorySelectStr()
  124. //{
  125. // var list = await CategoryRepository.GetAllListAsync();
  126. // string str = "";//"<option value=\"\" selected >请选择类别...</option>";
  127. // var tempParentNo = list.FirstOrDefault(a => a.ParentNo == null)?.Id ?? "";
  128. // foreach (var l in list)
  129. // {
  130. // var name = l.CategoryName;
  131. // var parentNo = l.ParentNo;
  132. // var id = l.Id;
  133. // if (l.ParentNo == null)
  134. // {
  135. // parentNo = "0";
  136. // id = "";
  137. // name = "请选择类别";
  138. // }
  139. // else if (l.ParentNo == tempParentNo)
  140. // {
  141. // parentNo = "";
  142. // }
  143. // str += $"<option parent=\"{parentNo}\" value=\"{id}\">{name}</option>";
  144. // }
  145. // return str;
  146. //}
  147. #endregion 用户
  148. #region CAMP
  149. public async Task<List<SelectListItem>> GetCampStateSelectList()
  150. {
  151. var list = await StatesManager.GetSelectListAsync("Camp", "State");
  152. return list;
  153. }
  154. public async Task<string> GetCampStateSelectStr()
  155. {
  156. var str = await StatesManager.GetSelectListStrAsync("Camp", "State");
  157. str = "<option value=\"\" selected >请选择培训营状态.</option>" + str;
  158. return str;
  159. }
  160. public async Task<string> GetCampStateSelectStr(params string[] states)
  161. {
  162. var str = await StatesManager.GetSelectListStrAsync("Camp", "State", a => states.Contains(a.CodeValue));
  163. str = "<option value=\"\" selected >请选择培训营状态.</option>" + str;
  164. return str;
  165. }
  166. public async Task<string> GetCanUseCampSelectStr()
  167. {
  168. var list = await CampRepository.GetAllListAsync(a => a.CampState == CampStateDefinition.Active);
  169. var str = "<option value=\"\" selected >请选择演练培训营...</option>";
  170. foreach (var l in list)
  171. {
  172. str += $"<option value=\"{l.Id}\" >{l.Name}</option>";
  173. }
  174. return str;
  175. }
  176. public async Task<string> GetCampSelectStr(params int[] states)
  177. {
  178. var list = await CampRepository.GetAllListAsync(a => states.Contains(a.CampState));
  179. var str = "<option value=\"\" selected >请选择演练培训营...</option>";
  180. foreach (var l in list)
  181. {
  182. str += $"<option value=\"{l.Id}\" >{l.Name}</option>";
  183. }
  184. return str;
  185. }
  186. #endregion CAMP
  187. #endregion SELECT
  188. /// <summary>
  189. /// 查询用户信息
  190. /// </summary>
  191. /// <param name="input"></param>
  192. /// <returns></returns>
  193. [DisableAuditing]
  194. public async Task<PagedResultDto<UserDto>> QueryUsers(IwbPagedRequestDto input)
  195. {
  196. var query = UserRepository.GetAll().Where(a => a.IsActive);
  197. query = ApplyFilter(query, input);
  198. var totalCount = await query.CountAsync();
  199. query = query.OrderBy(a => a.Id);
  200. query = query.Skip(input.SkipCount).Take(input.MaxResultCount);
  201. var entities = await query.ToListAsync();
  202. var dtoList = new PagedResultDto<UserDto>(totalCount, ObjectMapper.Map<List<UserDto>>(entities));
  203. return dtoList;
  204. }
  205. /// <summary>
  206. /// 查询用户信息
  207. /// </summary>
  208. /// <param name="id"></param>
  209. /// <returns></returns>
  210. [DisableAuditing]
  211. private User QueryUserInfo(long id)
  212. {
  213. return CacheManager.GetCache(IwbCacheNames.UserInfoCache).Get($"{id}", () =>
  214. {
  215. var user = UserRepository.FirstOrDefault(a => a.Id == id);
  216. return user;
  217. });
  218. }
  219. /// <summary>
  220. /// 查询课程根据类别
  221. /// </summary>
  222. /// <returns></returns>
  223. [DisableAuditing]
  224. public async Task<List<PlayDto>> QueryCampBySc(string no)
  225. {
  226. var nowDate = DateTime.Now.Date;
  227. var camp = await CampRepository.GetAllIncluding(a => a.Subject).Where(a => string.IsNullOrEmpty(no) || (a.Subject.CategoryPath).Contains(no))
  228. .Where(a => a.CampState == CampStateDefinition.Active && a.StartDate <= nowDate && a.EndDate >= nowDate)
  229. .Select(a => new PlayDto()
  230. {
  231. Id = a.Id,
  232. CampName = a.Name,
  233. PackageName = a.PackageName,
  234. MaxTrainingMinute = a.MaxTrainingMinute,
  235. SubjectPoint = a.SubjectPoint,
  236. EndDate = a.EndDate
  237. }).ToListAsync();
  238. return camp;
  239. }
  240. /// <summary>
  241. /// 查询可用训练营
  242. /// </summary>
  243. /// <returns></returns>
  244. [DisableAuditing]
  245. public async Task<List<PlayDto>> QueryCanUseCamp()
  246. {
  247. var nowDate = DateTime.Now.Date;
  248. var camp = await CampRepository.GetAll()
  249. .Where(a => a.CampState == CampStateDefinition.Active && a.StartDate <= nowDate && a.EndDate >= nowDate)
  250. .Select(a => new PlayDto()
  251. {
  252. Id = a.Id,
  253. CampName = a.Name,
  254. PackageName = a.PackageName,
  255. MaxTrainingMinute = a.MaxTrainingMinute,
  256. SubjectPoint = a.SubjectPoint,
  257. EndDate = a.EndDate ?? DateTime.Now.AddDays(10)
  258. }).ToListAsync();
  259. return camp;
  260. }
  261. /// <summary>
  262. /// 查询可加入训练营
  263. /// </summary>
  264. /// <returns></returns>
  265. [DisableAuditing]
  266. public async Task<List<PlayDto>> QueryCanJoinCamp()
  267. {
  268. var camp = await PlayRepository.GetAllIncluding(a => a.CampInfo).Where(a => a.PlayModel == CampPlayModelDefinition.Team && a.PlayState == CampPlayStateDefinition.New)
  269. .Select(a => new PlayDto()
  270. {
  271. Id = a.Id,
  272. Name = a.Name,
  273. CampName = a.CampInfo.Name,
  274. PackageName = a.CampInfo.PackageName,
  275. MaxTrainingMinute = a.CampInfo.MaxTrainingMinute,
  276. IsPublic = a.IsPublic
  277. }).ToListAsync();
  278. return camp;
  279. }
  280. /// <summary>
  281. /// 查询演练详情
  282. /// </summary>
  283. /// <returns></returns>
  284. [DisableAuditing]
  285. public async Task<CampPlayDto> QueryPlay(string no)
  286. {
  287. var camp = await PlayRepository.GetAll()
  288. .Select(a => new CampPlayDto()
  289. {
  290. Id = a.Id,
  291. Name = a.Name,
  292. CampNo = a.CampNo,
  293. PlayRoleNames = a.PlayRoleNames,
  294. IsPublic = a.IsPublic,
  295. InvitationCode = a.InvitationCode,
  296. PlayModel = a.PlayModel,
  297. PlayState = a.PlayState,
  298. RoundIndex = a.RoundIndex,
  299. StartDate = a.StartDate,
  300. EndDate = a.EndDate
  301. }).FirstOrDefaultAsync(a => a.Id == no);
  302. return camp;
  303. }
  304. /// <summary>
  305. /// 查询演练详情
  306. /// </summary>
  307. /// <returns></returns>
  308. [DisableAuditing]
  309. public async Task<CampDto> QueryCampWithStudy(string no)
  310. {
  311. var camp = await CampRepository.GetAll()
  312. .Select(a => new CampDto()
  313. {
  314. Id = a.Id,
  315. Name = a.Name,
  316. PackageName = a.PackageName,
  317. MaxTrainingMinute = a.MaxTrainingMinute,
  318. AssessRoleNames = a.AssessRoleNames,
  319. Description = a.Description,
  320. Purposes = a.Purposes,
  321. Organizer = a.Organizer,
  322. ContactInfo = a.ContactInfo,
  323. StartDate = a.StartDate,
  324. EndDate = a.EndDate,
  325. SubjectPoint = a.SubjectPoint,
  326. StudyContent = a.StudyContent
  327. }).FirstOrDefaultAsync(a => a.Id == no);
  328. return camp;
  329. }
  330. /// <summary>
  331. /// 预加载
  332. /// </summary>
  333. /// <returns></returns>
  334. [DisableAuditing]
  335. public async Task LoadPackagePre(int type)
  336. {
  337. if (type != 0)
  338. {
  339. CacheMangerEx.HasLoadPackageCache = true;
  340. }
  341. await CacheManager.LoadPackageInfos(DataCenterUrl);
  342. }
  343. /// <summary>
  344. /// 预加载
  345. /// </summary>
  346. /// <returns></returns>
  347. [DisableAuditing]
  348. public async Task LoadCampPre(string no, int type)
  349. {
  350. var camp = await CampRepository.GetAll().Select(a => new CampDto { Id = a.Id, PackageNo = a.PackageNo }).FirstOrDefaultAsync(a => a.Id == no);
  351. if (camp != null)
  352. {
  353. await Task.Run(() => { CacheManager.GetPackageDetail(camp.PackageNo, DataCenterUrl); });
  354. if (type != 0)
  355. {
  356. await Task.Run(() => { CacheManager.GetPackageDataNode(camp.PackageNo, DataCenterUrl); });
  357. }
  358. }
  359. }
  360. /// <summary>
  361. /// 查询训练营详情
  362. /// </summary>
  363. /// <returns></returns>
  364. [DisableAuditing]
  365. public async Task<CampDto> QueryCamp(string no)
  366. {
  367. var camp = await CampRepository.GetAll()
  368. .Select(a => new CampDto()
  369. {
  370. Id = a.Id,
  371. Name = a.Name,
  372. PackageNo = a.PackageNo,
  373. PackageName = a.PackageName,
  374. MaxTrainingMinute = a.MaxTrainingMinute,
  375. AssessRoleNames = a.AssessRoleNames,
  376. Description = a.Description,
  377. Purposes = a.Purposes,
  378. Organizer = a.Organizer,
  379. ContactInfo = a.ContactInfo,
  380. StartDate = a.StartDate,
  381. EndDate = a.EndDate,
  382. SubjectPoint = a.SubjectPoint
  383. }).FirstOrDefaultAsync(a => a.Id == no);
  384. //if (camp != null)
  385. //{
  386. // try
  387. // {
  388. // new TaskFactory().StartNew(() => { CacheManager.GetPackageDetail(camp.PackageNo, DataCenterUrl); });
  389. // }
  390. // catch
  391. // {
  392. // //
  393. // }
  394. //}
  395. return camp;
  396. }
  397. /// <summary>
  398. /// 查询训练营详情
  399. /// </summary>
  400. /// <returns></returns>
  401. [DisableAuditing]
  402. public async Task<CampDto> QueryCampByPlay(string no)
  403. {
  404. var camp = await PlayRepository.GetAllIncluding(a => a.CampInfo).Where(a => a.Id == no)
  405. .Select(a => new CampDto()
  406. {
  407. Id = a.CampInfo.Id,
  408. Name = a.CampInfo.Name,
  409. PackageName = a.CampInfo.PackageName,
  410. MaxTrainingMinute = a.CampInfo.MaxTrainingMinute,
  411. AssessRoleNames = a.CampInfo.AssessRoleNames,
  412. Description = a.CampInfo.Description,
  413. Purposes = a.CampInfo.Purposes,
  414. Organizer = a.CampInfo.Organizer,
  415. ContactInfo = a.CampInfo.ContactInfo,
  416. StartDate = a.StartDate,
  417. EndDate = a.EndDate
  418. }).FirstOrDefaultAsync();
  419. return camp;
  420. }
  421. /// <summary>
  422. /// 查询演练运行信息
  423. /// </summary>
  424. /// <param name="no"></param>
  425. /// <returns></returns>
  426. [DisableAuditing]
  427. public async Task<PackageDataNode> GetPlayRunningInfo(string no)
  428. {
  429. return await CacheManager.GetGroupRunningInfoAsync(no, PlayRepository);
  430. }
  431. /// <summary>
  432. /// 查询当前情景的处理日志
  433. /// </summary>
  434. /// <param name="no"></param>
  435. /// <returns></returns>
  436. [DisableAuditing]
  437. public async Task<List<PlayRoleLogDto>> GetCurrentSceneLog(string no)
  438. {
  439. var playInfo = await GetPlayDto(no);
  440. if (playInfo == null)
  441. {
  442. CheckErrors($"未查询编号为【{no}】到培训营!");
  443. return null;
  444. }
  445. var query = PlRepository.GetAll().Where(a =>
  446. a.PlayNo == no && a.LogType == LogTypeDefinition.SceneOperation &&
  447. a.RoundIndex == playInfo.RoundIndex &&
  448. (a.LogState == LogStateDefinition.New || a.LogState == LogStateDefinition.Submit ||
  449. a.LogState == LogStateDefinition.HasMatch))
  450. .OrderByDescending(a => a.Id).Select(a => new PlayRoleLogDto()
  451. {
  452. Id = a.Id,
  453. Play = no,
  454. Role = a.RoleName,
  455. Word = a.LogMessage,
  456. LogState = a.LogState,
  457. ScenePath = a.ScenePath
  458. });
  459. var dtoList = (await query.ToListAsync()).Select(MapLogDto).ToList();
  460. return dtoList;
  461. }
  462. /// <summary>
  463. /// 查询培训营分组的处理日志
  464. /// </summary>
  465. /// <param name="no"></param>
  466. /// <returns></returns>
  467. public async Task<List<PlayRoleLogDto>> GetPlayLogs(string no)
  468. {
  469. var playInfo = await GetPlayDto(no);
  470. if (playInfo == null)
  471. {
  472. CheckErrors($"未查询编号为【{no}】到培训营!");
  473. return null;
  474. }
  475. var query = PlRepository.GetAll()
  476. .Where(a => a.PlayNo == no && a.LogType == LogTypeDefinition.SceneOperation)
  477. .OrderByDescending(a => a.Id).Select(a => new PlayRoleLogDto()
  478. {
  479. Id = a.Id,
  480. Play = no,
  481. Role = a.RoleName,
  482. Word = a.LogMessage,
  483. LogState = a.LogState,
  484. UserId = a.UserId,
  485. ScenePath = a.ScenePath
  486. });
  487. var dtoList = (await query.ToListAsync()).Select(MapLogDto).ToList();
  488. return dtoList;
  489. }
  490. /// <summary>
  491. /// 查询培训营分组的处理日志
  492. /// </summary>
  493. /// <param name="no"></param>
  494. /// <returns></returns>
  495. public async Task<List<PlayRoleLogDto>> GetPlayChats(string no)
  496. {
  497. var playInfo = await GetPlayDto(no);
  498. if (playInfo == null)
  499. {
  500. CheckErrors($"未查询编号为【{no}】到培训营!");
  501. return null;
  502. }
  503. var query = PlRepository.GetAll()
  504. .Where(a => a.PlayNo == no && a.LogType == LogTypeDefinition.Comment && a.LogCommand == LogCommandDefinition.Chat)
  505. .OrderBy(a => a.CreationTime).Select(a => new PlayRoleLogDto()
  506. {
  507. Id = a.Id,
  508. Play = no,
  509. Role = a.RoleName,
  510. Word = a.LogMessage,
  511. LogState = a.LogState,
  512. UserId = a.UserId,
  513. UserName = a.UserName,
  514. LogDate = a.CreationTime
  515. });
  516. var dtoList = (await query.ToListAsync()).Select(MapLogDto).ToList();
  517. return dtoList;
  518. }
  519. public PlayRoleLogDto MapLogDto(PlayRoleLogDto input)
  520. {
  521. var user = QueryUserInfo(input.UserId);
  522. if (user != null)
  523. {
  524. input.Name = user.Name;
  525. input.ImagePath = user.ImagePath;
  526. }
  527. return input;
  528. }
  529. /// <summary>
  530. /// 获取分组情景
  531. /// </summary>
  532. /// <param name="no"></param>
  533. /// <returns></returns>
  534. public async Task<List<SceneDto>> GetPlayScenes(string no)
  535. {
  536. var playInfo = await GetPlayDto(no);
  537. if (playInfo == null)
  538. {
  539. CheckErrors($"未查询编号为【{no}】到培训营!");
  540. return null;
  541. }
  542. List<SceneDto> list = new List<SceneDto>();
  543. var sceneNoDto = (ScenePathDto)(await CacheManager.GetCache(IwbCacheNames.SceneInfoCache).GetOrDefaultAsync($"SceneNos-{no}"));
  544. if (sceneNoDto != null)
  545. {
  546. list = (List<SceneDto>)await CacheManager.GetCache(IwbCacheNames.SceneInfoCache).GetOrDefaultAsync($"SceneInfos-{no}");
  547. if (sceneNoDto.hasChange || list == null || list.Count == 0)
  548. {
  549. sceneNoDto.hasChange = false;
  550. await CacheManager.GetCache(IwbCacheNames.SceneInfoCache).SetAsync($"SceneNos-{no}", sceneNoDto);
  551. list = new List<SceneDto>();
  552. foreach (var sNo in sceneNoDto.PathList)
  553. {
  554. var scene = await GetPlaySceneInfo_Last(no, sNo);
  555. if (scene != null)
  556. {
  557. list.Add(scene);
  558. }
  559. }
  560. if (list.Any())
  561. {
  562. list = list.OrderBy(a => a.Path.Substring(0, 4)).ThenBy(a => a.Path.Length).ToList();
  563. }
  564. await CacheManager.GetCache(IwbCacheNames.SceneInfoCache).SetAsync($"SceneInfos-{no}", list);
  565. }
  566. }
  567. else
  568. {
  569. var runGroupInfo = await CacheManager.GetGroupRunningInfoAsync(no, PlayRepository);
  570. if (runGroupInfo == null)
  571. {
  572. return list;
  573. }
  574. var runRounds = runGroupInfo.Children?.Where(a => a.IsStart).OrderBy(a => a.Id);
  575. if (runRounds != null)
  576. foreach (var r in runRounds)
  577. {
  578. var runBlocks = r.Children?.Where(a => a.IsStart).OrderBy(a => a.Id);
  579. if (runBlocks != null)
  580. foreach (var b in runBlocks)
  581. {
  582. var runFlows = b.Children?.Where(a => a.IsStart).OrderBy(a => a.Id);
  583. if (runFlows != null)
  584. foreach (var f in runFlows)
  585. {
  586. var runNodes = f.Children?.Where(a => a.IsStart).OrderBy(a => a.Id);
  587. if (runNodes != null)
  588. foreach (var node in runNodes)
  589. {
  590. list = await GetSceneFromNode(list, node, no, playInfo.CampNo);
  591. }
  592. }
  593. }
  594. }
  595. if (list.Any())
  596. {
  597. list = list.OrderBy(a => a.Path.Substring(0, 4)).ThenBy(a => a.Path.Length).ToList();
  598. sceneNoDto = new ScenePathDto()
  599. {
  600. hasChange = false,
  601. PathList = list.Select(a => a.Id).ToList()
  602. };
  603. await CacheManager.GetCache(IwbCacheNames.SceneInfoCache).SetAsync($"SceneNos-{no}", sceneNoDto);
  604. await CacheManager.GetCache(IwbCacheNames.SceneInfoCache).SetAsync($"SceneInfos-{no}", list);
  605. }
  606. }
  607. if (list.Any())
  608. {
  609. list = list.OrderByDescending(a => a.HasEnd).ToList();
  610. }
  611. return list;
  612. }
  613. public async Task<CampPlayDto> GetPlayDto(string no)
  614. {
  615. var playInfo = await PlayRepository.GetAllIncluding(a => a.CampInfo).Select(a => new CampPlayDto
  616. {
  617. Id = a.Id,
  618. Name = a.Name,
  619. StartDate = a.StartDate,
  620. EndDate = a.EndDate,
  621. CampNo = a.CampNo,
  622. CampName = a.CampInfo.Name,
  623. RoundIndex = a.RoundIndex,
  624. InvitationCode = a.InvitationCode,
  625. IsPublic = a.IsPublic,
  626. PlayState = a.PlayState,
  627. PlayRoleNames = a.PlayRoleNames,
  628. TrainingMinute = a.TrainingMinute,
  629. PlayModel = a.PlayModel,
  630. }).FirstOrDefaultAsync(a => a.Id == no);
  631. return playInfo;
  632. }
  633. /// <summary>
  634. /// 提取情景节点中的情景信息
  635. /// </summary>
  636. /// <param name="list"></param>
  637. /// <param name="node"></param>
  638. /// <param name="playNo"></param>
  639. /// <param name="campNo"></param>
  640. /// <returns></returns>
  641. private async Task<List<SceneDto>> GetSceneFromNode(List<SceneDto> list, FlowNodeDataNode node, string playNo, string campNo)
  642. {
  643. if (node.SceneNodes != null)
  644. {
  645. foreach (var scene in node.SceneNodes)
  646. {
  647. //var dto = await GetSceneInfo(playNo, campNo, scene);
  648. //var dto = await GetPlaySceneInfo(playNo, scene.Id);
  649. var dto = await GetPlaySceneInfo_Last(playNo, scene.Path);
  650. if (dto != null)
  651. {
  652. dto.HasEnd = scene.IsEnd;
  653. list.Add(dto);
  654. }
  655. }
  656. }
  657. var runChild = node.Children?.FirstOrDefault(a => a.IsStart);
  658. if (runChild != null)
  659. {
  660. list = await GetSceneFromNode(list, runChild, playNo, campNo);
  661. }
  662. return list;
  663. }
  664. private async Task<SceneDto> GetSceneInfo(string no, string campNo, SceneDataNode runScene)
  665. {
  666. return await CacheManager.GetCache(IwbCacheNames.SceneInfoCache).GetAsync($"{no}-{runScene.Id}",
  667. async () =>
  668. {
  669. try
  670. {
  671. var detail = await CacheManager.GetCampPackageDetail(campNo, DataCenterUrl, CampRepository);
  672. var scene = detail?.Scenes.FirstOrDefault(a => a.Id == runScene.Id);
  673. if (scene == null)
  674. {
  675. return null;
  676. }
  677. var dto = scene.Obj2String().Str2Obj<SceneDto>();
  678. var runGroupInfo = await CacheManager.GetGroupRunningInfoAsync(no, PlayRepository);
  679. if (runGroupInfo == null)
  680. {
  681. return null;
  682. }
  683. dto.HasEnd = runScene.IsEnd;
  684. dto.Variables = dto.Variables.MergeHashtable(runScene.GetVariables());
  685. var gList = new List<GuideModel>();
  686. if (scene.GuideNos.IsNotEmpty())
  687. {
  688. var arr = scene.GuideNos.Split(',');
  689. foreach (var gNo in arr)
  690. {
  691. var g = detail.Guides?.FirstOrDefault(a => a.Id == gNo);
  692. if (g != null)
  693. {
  694. gList.Add(g);
  695. }
  696. }
  697. }
  698. dto.GuideInfos = gList;
  699. var attachList =
  700. await CacheManager.GetSceneAttaches(campNo, runScene.Id, SceneMapRepository, AttachRepository);
  701. dto.Attaches = attachList;
  702. return dto;
  703. }
  704. catch (Exception e)
  705. {
  706. this.LogError(e);
  707. }
  708. return null;
  709. });
  710. }
  711. /// <summary>
  712. /// 查询情景(缓存中未结束的重新查询)
  713. /// </summary>
  714. /// <param name="no"></param>
  715. /// <param name="scenePath"></param>
  716. /// <returns></returns>
  717. private async Task<SceneDto> GetPlaySceneInfo_Last(string no, string scenePath)
  718. {
  719. //return await CacheManager.GetCache(IwbCacheNames.SceneInfoCache).GetAsync($"{no}-{sceneNo}-end", async () =>
  720. //{
  721. //});
  722. var dto = CacheManager.GetCache(IwbCacheNames.SceneInfoCache)
  723. .Get($"{no}-{scenePath}-end", () => default(SceneDto));
  724. if (dto == null)
  725. {
  726. await CacheManager.GetCache(IwbCacheNames.SceneInfoCache).RemoveAsync($"{no}-{scenePath}");
  727. dto = await GetPlaySceneInfo(no, scenePath);
  728. }
  729. return dto;
  730. }
  731. [DisableAuditing, AbpAllowAnonymous]
  732. [WrapResult(false)]
  733. public Task<SceneDto> GetSceneInfo(string no, string sceneNo)
  734. {
  735. return GetPlaySceneInfo(no, sceneNo);
  736. }
  737. /// <summary>
  738. /// 查询情景信息
  739. /// </summary>
  740. /// <param name="no"></param>
  741. /// <param name="scenePath"></param>
  742. /// <returns></returns>
  743. [DisableAuditing]
  744. public async Task<SceneDto> GetPlaySceneInfo(string no, string scenePath)
  745. {
  746. var playCampNo = await PlayRepository.GetAll().Where(a => a.Id == no).Select(a => a.CampNo)
  747. .FirstOrDefaultAsync();
  748. if (playCampNo == null)
  749. {
  750. CheckErrors($"未查询编号为【{no}】到培训营!");
  751. return null;
  752. }
  753. var sceneDto = await CacheManager.GetCache(IwbCacheNames.SceneInfoCache).GetAsync($"{no}-{scenePath}",
  754. async () =>
  755. {
  756. SceneDto dto = null;
  757. try
  758. {
  759. var detail = await CacheManager.GetCampPackageDetail(playCampNo, DataCenterUrl, CampRepository);
  760. var scene = detail?.Scenes.FirstOrDefault(a => a.Path == scenePath);
  761. if (scene == null)
  762. {
  763. return null;
  764. }
  765. dto = scene.Obj2String().Str2Obj<SceneDto>();
  766. //var runGroupInfo = await CacheManager.GetGroupRunningInfo(no, PlayRepository);
  767. //var runScene = runGroupInfo.RunSceneInfos.FirstOrDefault(a => a.Path == scene.Path);
  768. var runScene = await GetRunScene(no, scene);
  769. if (runScene != null)
  770. {
  771. dto.HasEnd = runScene.IsEnd;
  772. dto.Variables = dto.Variables.MergeHashtable(runScene.GetVariables());
  773. }
  774. var gList = new List<GuideModel>();
  775. if (scene.GuideNos.IsNotEmpty())
  776. {
  777. var arr = scene.GuideNos.Split(',');
  778. foreach (var gNo in arr)
  779. {
  780. var g = detail.Guides?.FirstOrDefault(a => a.Id == gNo);
  781. if (g != null)
  782. {
  783. gList.Add(g);
  784. }
  785. }
  786. }
  787. dto.GuideInfos = gList;
  788. var attachList =
  789. await CacheManager.GetSceneAttaches(playCampNo, scene.Id, SceneMapRepository, AttachRepository);
  790. dto.Attaches = attachList;
  791. }
  792. catch (Exception e)
  793. {
  794. this.LogError(e);
  795. }
  796. return dto;
  797. });
  798. if (sceneDto.HasEnd)
  799. {
  800. await CacheManager.GetCache(IwbCacheNames.SceneInfoCache).SetAsync($"{no}-{scenePath}-end", sceneDto);
  801. }
  802. return sceneDto;
  803. }
  804. private async Task<SceneDataNode> GetRunScene(string no, SceneModel scene)
  805. {
  806. SceneDataNode runScene = null;
  807. var i = 0;
  808. while (runScene == null && i < 20)
  809. {
  810. var runGroupInfo = await CacheManager.GetGroupRunningInfoAsync(no, PlayRepository);
  811. runScene = runGroupInfo?.RunSceneInfos.FirstOrDefault(a => a.Path == scene.Path);
  812. //if (runScene == null)
  813. //{
  814. // await CacheManager.GetCache(IwbCacheNames.PlayRunningInfoCache).RemoveAsync(no);
  815. // Thread.Sleep(200);
  816. //}
  817. int time = 300 - i * 50;
  818. time = time > 0 ? time : 50;
  819. Thread.Sleep(time);
  820. i++;
  821. }
  822. return runScene;
  823. }
  824. /// <summary>
  825. /// 查询分组当前轮次得分
  826. /// </summary>
  827. /// <param name="no"></param>
  828. /// <returns></returns>
  829. [DisableAuditing]
  830. public async Task<PlayScoreDto> GetPlayScoreInfo(string no)
  831. {
  832. var playInfo = await GetPlayDto(no);
  833. if (playInfo == null)
  834. {
  835. CheckErrors($"未查询编号为【{no}】到培训营!");
  836. return null;
  837. }
  838. var score = await PsRepository.GetAll().Where(a => a.PlayNo == no).OrderByDescending(a => a.RoundIndex)
  839. .FirstOrDefaultAsync();
  840. if (score == null)
  841. {
  842. return null;
  843. }
  844. var dto = ObjectMapper.Map<PlayScoreDto>(score);
  845. return dto;
  846. }
  847. /// <summary>
  848. /// 获取子课程类别
  849. /// </summary>
  850. /// <param name="input"></param>
  851. /// <returns></returns>
  852. [DisableAuditing]
  853. public async Task<List<JsTreeDto>> GetChildSubjectCategory(EntityDto<string> input)
  854. {
  855. if (input.Id.IsEmpty() || input.Id == "#" || input.Id == "0")
  856. {
  857. input.Id = IwbConsts.SubjectCategoryRootNo;
  858. this.LogDebug(input.Id);
  859. }
  860. var list = new List<JsTreeDto>();
  861. var children = await ScRepository.GetAllListAsync(a => a.ParentNo == input.Id);
  862. if (children.Any())
  863. {
  864. foreach (var child in children)
  865. {
  866. list.Add(new JsTreeDto()
  867. {
  868. Id = child.Id,
  869. Text = child.CategoryName,
  870. Children = (await ScRepository.CountAsync(a => a.ParentNo == child.Id)) > 0
  871. });
  872. }
  873. }
  874. return list;
  875. }
  876. }
  877. }