QueryAppService.cs 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Data.Entity;
  4. using System.Diagnostics;
  5. using System.Linq;
  6. using System.Threading;
  7. using System.Threading.Tasks;
  8. using System.Web.Mvc;
  9. using Abp.Application.Services.Dto;
  10. using Abp.Auditing;
  11. using Abp.Authorization;
  12. using Abp.Configuration;
  13. using Abp.Domain.Repositories;
  14. using Abp.Runtime.Caching;
  15. using IwbZero.AppServiceBase;
  16. using IwbZero.ToolCommon.LogHelpers;
  17. using IwbZero.ToolCommon.StringModel;
  18. using WeApp.Authorization.Users;
  19. using WeApp.BaseInfo;
  20. using WeApp.BaseSystem.Users.Dto;
  21. using WeApp.BasicInfo;
  22. using WeApp.BasicInfo.TrainingRoleGroup.Dto;
  23. using WeApp.Configuration;
  24. using WeApp.Configuration.Cache;
  25. using WeApp.TrainingCamp;
  26. using WeApp.TrainingCamp.Dto;
  27. using WeApp.TrainingCampGroup.Dto;
  28. using WeApp.TrainingEval.Dto;
  29. using WeEngine.ModelInfo;
  30. using WeEngine.Packages;
  31. namespace WeApp.BaseSystem.Query
  32. {
  33. [AbpAllowAnonymous, DisableAuditing]
  34. public class QueryAppService : IwbAppServiceBase, IQueryAppService
  35. {
  36. #region 仓储
  37. public QueryAppService(
  38. IRepository<User, long> userRepository, IRepository<CampInfo, string> campRepository, IRepository<CampGroupInfo, string> groupRepository, IRepository<CampRelateGroupRoleInfo> cgrRepository, IRepository<TrainingGroupRelateRoleInfo> grrRepository, IRepository<GroupRoleInfo> groupRoleRepository, IRepository<TrainingRoleInfo, string> roleRepository, IRepository<GroupLogInfo> glRepository, IRepository<CampSceneMapInfo> sceneMapRepository, IRepository<SysAttachFile> attachRepository, IRepository<GroupScoreInfo> gsRepository, IRepository<PortraitRemarkInfo> prRepository)
  39. {
  40. UserRepository = userRepository;
  41. CampRepository = campRepository;
  42. GroupRepository = groupRepository;
  43. CgrRepository = cgrRepository;
  44. GrrRepository = grrRepository;
  45. GroupRoleRepository = groupRoleRepository;
  46. RoleRepository = roleRepository;
  47. GlRepository = glRepository;
  48. SceneMapRepository = sceneMapRepository;
  49. AttachRepository = attachRepository;
  50. GsRepository = gsRepository;
  51. PrRepository = prRepository;
  52. }
  53. private string DataCenterUrl => SettingManager.GetSettingValue(IwbSettingNames.WeDataCenterIp).Ew("/");
  54. // private string EngineUrl => SettingManager.GetSettingValue(IwbSettingNames.WeDataCenterIp).Ew("/");
  55. protected IRepository<CampInfo, string> CampRepository { get; }
  56. protected IRepository<CampGroupInfo, string> GroupRepository { get; }
  57. protected IRepository<CampRelateGroupRoleInfo> CgrRepository { get; }
  58. protected IRepository<TrainingGroupRelateRoleInfo> GrrRepository { get; }
  59. protected IRepository<GroupRoleInfo> GroupRoleRepository { get; }
  60. protected IRepository<GroupScoreInfo> GsRepository { get; }
  61. protected IRepository<GroupLogInfo> GlRepository { get; }
  62. protected IRepository<TrainingRoleInfo, string> RoleRepository { get; }
  63. protected IRepository<User, long> UserRepository { get; }
  64. protected IRepository<PortraitRemarkInfo> PrRepository { get; }
  65. protected IRepository<CampSceneMapInfo> SceneMapRepository { get; }
  66. protected IRepository<SysAttachFile> AttachRepository { get; }
  67. #endregion 仓储
  68. #region SELECT
  69. #region Camp && Group
  70. public async Task<List<SelectListItem>> GetCampStateSelectList()
  71. {
  72. var list = await StatesManager.GetSelectListAsync("Camp", "State");
  73. return list;
  74. }
  75. public async Task<string> GetCampStateSelectStr()
  76. {
  77. var str = await StatesManager.GetSelectListStrAsync("Camp", "State");
  78. str = "<option value=\"\" selected >请选择培训营状态.</option>" + str;
  79. return str;
  80. }
  81. public async Task<string> GetCampStateSelectStr(params string[] states)
  82. {
  83. var str = await StatesManager.GetSelectListStrAsync("Camp", "State", a => states.Contains(a.CodeValue));
  84. str = "<option value=\"\" selected >请选择培训营状态.</option>" + str;
  85. return str;
  86. }
  87. public async Task<List<SelectListItem>> GetCampGroupStateSelectList()
  88. {
  89. var list = await StatesManager.GetSelectListAsync("CampGroup", "State");
  90. return list;
  91. }
  92. public async Task<string> GetCampGroupStateSelectStr()
  93. {
  94. var str = await StatesManager.GetSelectListStrAsync("CampGroup", "State");
  95. return str;
  96. }
  97. public async Task<string> GetCampSelectStr(params int[] states)
  98. {
  99. var list = await CampRepository.GetAllListAsync(a => states.Contains(a.CampState));
  100. var str = "<option value=\"\" selected >请选择演练培训营...</option>";
  101. foreach (var l in list)
  102. {
  103. str += $"<option value=\"{l.Id}\" >{l.Name}</option>";
  104. }
  105. return str;
  106. }
  107. public async Task<string> GetCampGroupSelectStr(string no)
  108. {
  109. var list = await GroupRepository.GetAllListAsync(a => a.CampNo == no);
  110. var str = "<option value=\"\" selected >请选择培训营分组...</option>";
  111. foreach (var l in list)
  112. {
  113. str += $"<option value=\"{l.Id}\" >{l.Name}</option>";
  114. }
  115. return str;
  116. }
  117. public async Task<string> GetGroupRoleSelectStr(string no)
  118. {
  119. var list = (await GroupRoleRepository.FirstOrDefaultAsync(a => a.GroupNo == no))?.RoleNames?.Split(',').ToList() ?? new List<string>();
  120. var str = "<option value=\"\" selected >请选择角色...</option>";
  121. foreach (var l in list)
  122. {
  123. str += $"<option value=\"{l}\" >{l}</option>";
  124. }
  125. return str;
  126. }
  127. #endregion Camp && Group
  128. /// <summary>
  129. /// 画像预置信息类型
  130. /// </summary>
  131. /// <returns></returns>
  132. public async Task<string> GetPortraitRemarkTypeSelectStr()
  133. {
  134. var str = await StatesManager.GetSelectListStrAsync("PortraitRemark", "Type");
  135. str = "<option value=\"\" selected >请选择信息类型...</option>" + str;
  136. return str;
  137. }
  138. #region 用户
  139. [DisableAuditing]
  140. public async Task<List<SelectListItem>> GetUserSelectList()
  141. {
  142. var list = await UserRepository.GetAllListAsync();
  143. var sList = new List<SelectListItem> { new SelectListItem { Text = @"请选择用户...", Value = "", Selected = true } };
  144. foreach (var l in list)
  145. {
  146. sList.Add(new SelectListItem { Value = l.Id + "", Text = l.Name });
  147. }
  148. return sList;
  149. }
  150. [DisableAuditing]
  151. public async Task<string> GetUserSelectStr()
  152. {
  153. var list = await UserRepository.GetAllListAsync();
  154. var str = "<option value=\"\" selected >请选择用户...</option>";
  155. foreach (var l in list)
  156. {
  157. str += $"<option value=\"{l.Id}\" >{l.Name}</option>";
  158. }
  159. return str;
  160. }
  161. //[DisableAuditing]
  162. //public async Task<string> GetCategorySelectStr()
  163. //{
  164. // var list = await CategoryRepository.GetAllListAsync();
  165. // string str = "";//"<option value=\"\" selected >请选择类别...</option>";
  166. // var tempParentNo = list.FirstOrDefault(a => a.ParentNo == null)?.Id ?? "";
  167. // foreach (var l in list)
  168. // {
  169. // var name = l.CategoryName;
  170. // var parentNo = l.ParentNo;
  171. // var id = l.Id;
  172. // if (l.ParentNo == null)
  173. // {
  174. // parentNo = "0";
  175. // id = "";
  176. // name = "请选择类别";
  177. // }
  178. // else if (l.ParentNo == tempParentNo)
  179. // {
  180. // parentNo = "";
  181. // }
  182. // str += $"<option parent=\"{parentNo}\" value=\"{id}\">{name}</option>";
  183. // }
  184. // return str;
  185. //}
  186. #endregion 用户
  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="no"></param>
  209. /// <returns></returns>
  210. [DisableAuditing]
  211. public async Task<List<CampGroupDto>> GetCampGroups(string no)
  212. {
  213. var query = await GroupRepository.GetAllListAsync(a => a.CampNo == no);
  214. var list = query.Select(ObjectMapper.Map<CampGroupDto>).ToList();
  215. return list;
  216. }
  217. /// <summary>
  218. /// 获取培训的角色组预案
  219. /// </summary>
  220. /// <param name="no"></param>
  221. /// <returns></returns>
  222. public async Task<List<TrainingRoleGroupDto>> GetCampRoleGroupInfos(string no)
  223. {
  224. var roleGroups = await CgrRepository.GetAllIncluding(a => a.TrainingRoleGroupInfo).Where(a => a.CampNo == no).Select(a => a.TrainingRoleGroupInfo).ToListAsync();
  225. var dtoList = new List<TrainingRoleGroupDto>();
  226. foreach (var roleGroup in roleGroups)
  227. {
  228. var dto = ObjectMapper.Map<TrainingRoleGroupDto>(roleGroup);
  229. var roles = GrrRepository.GetAllIncluding(a => a.TrainingRoleInfo).Where(a => a.RoleGroupNo == dto.Id);
  230. dto.RoleNos = roles.Select(a => a.TrainRoleNo).ToList();
  231. dto.RoleNames = string.Join(",", roles.Select(a => a.TrainingRoleInfo.RoleName).ToArray());
  232. dtoList.Add(dto);
  233. }
  234. return dtoList;
  235. }
  236. /// <summary>
  237. /// 预加载
  238. /// </summary>
  239. /// <returns></returns>
  240. [DisableAuditing]
  241. public async Task LoadCampPre(string no, int type)
  242. {
  243. var camp = await GroupRepository.GetAllIncluding(a => a.CampInfo).Where(a => a.Id == no).Select(a => new CampDto { PackageNo = a.CampInfo.PackageNo }).FirstOrDefaultAsync();
  244. if (camp != null)
  245. {
  246. await Task.Run(() => { CacheManager.GetPackageDetail(camp.PackageNo, DataCenterUrl); });
  247. if (type != 0)
  248. {
  249. await Task.Run(() => { CacheManager.GetPackageDataNode(camp.PackageNo, DataCenterUrl); });
  250. }
  251. }
  252. }
  253. /// <summary>
  254. /// 查询培训营分组的演练角色
  255. /// </summary>
  256. /// <param name="no"></param>
  257. /// <returns></returns>
  258. public async Task<List<string>> GetGroupRoleInfos(string no)
  259. {
  260. var entity = await GroupRoleRepository.FirstOrDefaultAsync(a => a.GroupNo == no);
  261. var list = entity?.RoleNames?.Split(',').ToList() ?? new List<string>();
  262. return list;
  263. }
  264. /// <summary>
  265. /// 查询培训营分组的演练角色预案
  266. /// </summary>
  267. /// <param name="no"></param>
  268. /// <returns></returns>
  269. public async Task<GroupRolePlanDto> GetGroupRolePlans(string no)
  270. {
  271. return await CacheManager.GetCache(IwbCacheNames.GroupInfoCache).GetAsync($"Plan-{no}", async () =>
  272. {
  273. var entity = await GroupRoleRepository.FirstOrDefaultAsync(a => a.GroupNo == no);
  274. if (entity == null)
  275. {
  276. return null;
  277. }
  278. var plans = new List<RolePlanDto>();
  279. if (entity.RoleGroupNos != null)
  280. {
  281. var nos = entity.RoleGroupNos.Split(',');
  282. foreach (var n in nos)
  283. {
  284. var gr = await GrrRepository.GetAllIncluding(a => a.TrainingRoleInfo, a => a.RoleGroupInfo)
  285. .Where(a => a.RoleGroupNo == n).ToListAsync();
  286. if (gr.Any())
  287. {
  288. var name = gr[0].RoleGroupInfo.RoleGroupName;
  289. var roles = gr.Select(a => a.TrainingRoleInfo.RoleName).ToList();
  290. plans.Add(new RolePlanDto() { Name = name, RoleName = roles });
  291. }
  292. }
  293. }
  294. if (entity.CustomRoles.IsNotEmpty())
  295. {
  296. plans.Add(new RolePlanDto()
  297. {
  298. Name = "自定义角色",
  299. RoleName = entity.CustomRoles.Split(',').ToList()
  300. });
  301. }
  302. return new GroupRolePlanDto() { GroupNo = no, Plans = plans };
  303. });
  304. }
  305. /// <summary>
  306. /// 查询培训营情景路径
  307. /// </summary>
  308. /// <param name="no"></param>
  309. /// <returns></returns>
  310. public async Task<List<PackageDataNode>> GetCampRunningInfos(string no)
  311. {
  312. var groupNos = await GroupRepository.GetAll().Where(a => a.CampNo == no).Select(a => a.Id).ToListAsync();
  313. var list = new List<PackageDataNode>();
  314. if (groupNos.Any())
  315. {
  316. foreach (var groupNo in groupNos)
  317. {
  318. var runGroupInfo = await CacheManager.GetGroupRunningInfo(groupNo, GroupRepository);
  319. if (runGroupInfo != null)
  320. {
  321. list.Add(runGroupInfo);
  322. }
  323. }
  324. }
  325. return list;
  326. }
  327. /// <summary>
  328. /// 获取某组的情景路径
  329. /// </summary>
  330. /// <param name="no"></param>
  331. /// <returns></returns>
  332. public async Task<PackageDataNode> GetGroupRunningInfo(string no)
  333. {
  334. var runGroupInfo = await CacheManager.GetGroupRunningInfo(no, GroupRepository);
  335. return runGroupInfo;
  336. }
  337. //private RunningInfo GetRunningInfo(string no)
  338. //{
  339. // var url =
  340. // $"{EngineUrl}api/services/Engine/Run/QueryRunningInfo?runningId={no}";
  341. // var result = url.RequestPost("");
  342. // var info = result.Str2Obj<RunningInfo>();
  343. // return info;
  344. //}
  345. /// <summary>
  346. /// 查询当前情景的处理日志
  347. /// </summary>
  348. /// <param name="no"></param>
  349. /// <returns></returns>
  350. [DisableAuditing]
  351. public async Task<List<GroupRoleLogDto>> GetCurrentSceneLog(string no)
  352. {
  353. var group = await GroupRepository.FirstOrDefaultAsync(a => a.Id == no);
  354. if (group == null)
  355. {
  356. CheckErrors($"未查询编号为【{no}】到培训营!");
  357. return null;
  358. }
  359. var query = GlRepository.GetAll().Where(a =>
  360. a.GroupNo == no && a.LogType == LogTypeDefinition.SceneOperation &&
  361. a.RoundIndex == group.RoundIndex &&
  362. (a.LogState == LogStateDefinition.New || a.LogState == LogStateDefinition.Submit || a.LogState == LogStateDefinition.HasMatch))
  363. .OrderByDescending(a => a.Id).Select(a => new GroupRoleLogDto()
  364. {
  365. Id = a.Id,
  366. GroupNo = no,
  367. Role = a.RoleName,
  368. Word = a.LogMessage,
  369. LogState = a.LogState
  370. });
  371. var dtoList = await query.ToListAsync();
  372. return dtoList;
  373. }
  374. /// <summary>
  375. /// 查询培训营分组的处理日志
  376. /// </summary>
  377. /// <param name="no"></param>
  378. /// <returns></returns>
  379. public async Task<List<GroupRoleLogDto>> GetGroupLogs(string no)
  380. {
  381. var group = await GroupRepository.FirstOrDefaultAsync(a => a.Id == no);
  382. if (group == null)
  383. {
  384. CheckErrors($"未查询编号为【{no}】到培训营!");
  385. return null;
  386. }
  387. var query = GlRepository.GetAll().Where(a => a.GroupNo == no && a.LogType == LogTypeDefinition.SceneOperation)
  388. .OrderByDescending(a => a.Id).Select(a => new GroupRoleLogDto()
  389. {
  390. Id = a.Id,
  391. GroupNo = no,
  392. Role = a.RoleName,
  393. Word = a.LogMessage,
  394. LogState = a.LogState
  395. });
  396. var dtoList = await query.ToListAsync();
  397. return dtoList;
  398. }
  399. /// <summary>
  400. /// 获取分组情景
  401. /// </summary>
  402. /// <param name="no"></param>
  403. /// <returns></returns>
  404. public async Task<List<SceneDto>> GetGroupScenes(string no)
  405. {
  406. var group = await GroupRepository.FirstOrDefaultAsync(a => a.Id == no);
  407. if (group == null)
  408. {
  409. CheckErrors($"未查询编号为【{no}】到培训营!");
  410. return null;
  411. }
  412. List<SceneDto> list = new List<SceneDto>();
  413. var pathDto = (ScenePathDto)(await CacheManager.GetCache(IwbCacheNames.SceneInfoCache)
  414. .GetOrDefaultAsync($"SceneNos-{no}"));
  415. if (pathDto != null)
  416. {
  417. list = (List<SceneDto>)await CacheManager.GetCache(IwbCacheNames.SceneInfoCache).GetOrDefaultAsync($"SceneInfos-{no}");
  418. if (pathDto.hasChange || list == null || list.Count == 0)
  419. {
  420. pathDto.hasChange = false;
  421. await CacheManager.GetCache(IwbCacheNames.SceneInfoCache).SetAsync($"SceneNos-{no}", pathDto);
  422. list = new List<SceneDto>();
  423. foreach (var path in pathDto.PathList)
  424. {
  425. var scene = await GetSceneInfo_Last(no, path);
  426. if (scene != null)
  427. {
  428. list.Add(scene);
  429. }
  430. }
  431. await CacheManager.GetCache(IwbCacheNames.SceneInfoCache).SetAsync($"SceneInfos-{no}", list);
  432. }
  433. }
  434. else
  435. {
  436. var runGroupInfo = await CacheManager.GetGroupRunningInfo(no, GroupRepository);
  437. if (runGroupInfo == null)
  438. {
  439. return list;
  440. }
  441. var runRounds = runGroupInfo.Children?.Where(a => a.IsStart).OrderBy(a => a.Id);
  442. if (runRounds != null)
  443. foreach (var r in runRounds)
  444. {
  445. var runBlocks = r.Children?.Where(a => a.IsStart).OrderBy(a => a.Id);
  446. if (runBlocks != null)
  447. foreach (var b in runBlocks)
  448. {
  449. var runFlows = b.Children?.Where(a => a.IsStart).OrderBy(a => a.Id);
  450. if (runFlows != null)
  451. foreach (var f in runFlows)
  452. {
  453. var runNodes = f.Children?.Where(a => a.IsStart).OrderBy(a => a.Id);
  454. if (runNodes != null)
  455. foreach (var node in runNodes)
  456. {
  457. list = await GetSceneFromNode(list, node, no);
  458. }
  459. }
  460. }
  461. }
  462. if (list.Any())
  463. {
  464. pathDto = new ScenePathDto()
  465. {
  466. hasChange = false,
  467. PathList = list.Select(a => a.Path).ToList()
  468. };
  469. await CacheManager.GetCache(IwbCacheNames.SceneInfoCache).SetAsync($"SceneNos-{no}", pathDto);
  470. }
  471. }
  472. if (list.Any())
  473. {
  474. list = list.OrderByDescending(a => a.HasEnd).ToList();
  475. }
  476. return list;
  477. }
  478. /// <summary>
  479. /// 提取情景节点中的情景信息
  480. /// </summary>
  481. /// <param name="list"></param>
  482. /// <param name="node"></param>
  483. /// <param name="groupNo"></param>
  484. /// <returns></returns>
  485. private async Task<List<SceneDto>> GetSceneFromNode(List<SceneDto> list, FlowNodeDataNode node, string groupNo)
  486. {
  487. if (node.SceneNodes != null)
  488. {
  489. foreach (var scene in node.SceneNodes)
  490. {
  491. var dto = await GetGroupSceneInfo(groupNo, scene.Path);
  492. if (dto != null)
  493. {
  494. dto.HasEnd = scene.IsEnd;
  495. list.Add(dto);
  496. }
  497. }
  498. }
  499. var child = node.Children?.FirstOrDefault(a => a.IsStart);
  500. if (child != null)
  501. {
  502. list = await GetSceneFromNode(list, child, groupNo);
  503. }
  504. return list;
  505. }
  506. private async Task<SceneDto> GetSceneInfo_Last(string no, string scenePath)
  507. {
  508. var dto = CacheManager.GetCache(IwbCacheNames.SceneInfoCache)
  509. .Get($"{no}-{scenePath}-end", () => default(SceneDto));
  510. if (dto == null)
  511. {
  512. await CacheManager.GetCache(IwbCacheNames.SceneInfoCache).RemoveAsync($"{no}-{scenePath}");
  513. dto = await GetGroupSceneInfo(no, scenePath);
  514. }
  515. return dto;
  516. }
  517. /// <summary>
  518. /// 查询情景信息
  519. /// </summary>
  520. /// <param name="no"></param>
  521. /// <param name="scenePath"></param>
  522. /// <returns></returns>
  523. [DisableAuditing]
  524. public async Task<SceneDto> GetGroupSceneInfo(string no, string scenePath)
  525. {
  526. //Stopwatch stopwatch = new Stopwatch();
  527. //Stopwatch stopwatch2 = new Stopwatch();
  528. //stopwatch.Start();
  529. //stopwatch2.Start();
  530. var groupCampNo = await GroupRepository.GetAll().Where(a => a.Id == no).Select(a => a.CampNo).FirstOrDefaultAsync();
  531. if (groupCampNo == null)
  532. {
  533. CheckErrors($"未查询编号为【{no}】到培训营!");
  534. return null;
  535. }
  536. var sceneDto = await CacheManager.GetCache(IwbCacheNames.SceneInfoCache).GetAsync($"{no}-{scenePath}",
  537. async () =>
  538. {
  539. SceneDto dto = null;
  540. try
  541. {
  542. var detail = await CacheManager.GetCampPackageDetail(groupCampNo, DataCenterUrl, CampRepository);
  543. var scene = detail?.Scenes.FirstOrDefault(a => a.Path == scenePath);
  544. if (scene == null)
  545. {
  546. return null;
  547. }
  548. dto = scene.Obj2String().Str2Obj<SceneDto>();
  549. //var runGroupInfo = await CacheManager.GetGroupRunningInfo(no, GroupRepository);
  550. //if (runGroupInfo == null)
  551. //{
  552. // return null;
  553. //}
  554. //var runScene = runGroupInfo.RunSceneInfos.FirstOrDefault(a => a.Path == scene.Path);
  555. //stopwatch.Stop();
  556. //this.LogInfo($"1耗时{scenePath}:{stopwatch.ElapsedMilliseconds}毫秒");
  557. //stopwatch.Restart();
  558. var runScene = await GetRunScene(no, scene);
  559. if (runScene != null)
  560. {
  561. dto.HasEnd = runScene.IsEnd;
  562. dto.Variables = dto.Variables.MergeHashtable(runScene.GetVariables());
  563. }
  564. //stopwatch.Stop();
  565. //this.LogInfo($"2耗时{scenePath}:{stopwatch.ElapsedMilliseconds}毫秒");
  566. //stopwatch.Restart();
  567. var gList = new List<GuideModel>();
  568. if (scene.GuideNos.IsNotEmpty())
  569. {
  570. var arr = scene.GuideNos.Split(',');
  571. foreach (var gNo in arr)
  572. {
  573. var g = detail.Guides?.FirstOrDefault(a => a.Id == gNo);
  574. if (g != null)
  575. {
  576. gList.Add(g);
  577. }
  578. }
  579. }
  580. dto.GuideInfos = gList;
  581. var attachList =
  582. await CacheManager.GetSceneAttaches(groupCampNo, scene.Id, SceneMapRepository, AttachRepository);
  583. dto.Attaches = attachList;
  584. }
  585. catch (Exception e)
  586. {
  587. this.LogError(e);
  588. }
  589. //stopwatch2.Stop();
  590. //this.LogInfo($"【总耗时】:{stopwatch2.ElapsedMilliseconds}毫秒");
  591. return dto;
  592. });
  593. if (sceneDto != null && sceneDto.HasEnd)
  594. {
  595. await CacheManager.GetCache(IwbCacheNames.SceneInfoCache).SetAsync($"{no}-{scenePath}-end", sceneDto);
  596. }
  597. return sceneDto;
  598. }
  599. private async Task<SceneDataNode> GetRunScene(string no, SceneModel scene)
  600. {
  601. SceneDataNode runScene = null;
  602. var i = 0;
  603. while (runScene == null && i < 5)
  604. {
  605. var runGroupInfo = await CacheManager.GetGroupRunningInfo(no, GroupRepository);
  606. runScene = runGroupInfo?.RunSceneInfos.FirstOrDefault(a => a.Path == scene.Path);
  607. i++;
  608. //if (runScene == null)
  609. //{
  610. // await CacheManager.GetCache(IwbCacheNames.GroupRunningInfoCache).RemoveAsync(no);
  611. // Thread.Sleep(500 * i);
  612. //}
  613. int time = 400 - i * 50;
  614. time = time > 0 ? time : 50;
  615. Thread.Sleep(time);
  616. }
  617. return runScene;
  618. }
  619. /// <summary>
  620. /// 查询分组当前轮次得分
  621. /// </summary>
  622. /// <param name="no"></param>
  623. /// <returns></returns>
  624. [DisableAuditing]
  625. public async Task<GroupScoreDto> GetGroupScoreInfo(string no)
  626. {
  627. var group = await GroupRepository.FirstOrDefaultAsync(a => a.Id == no);
  628. if (group == null)
  629. {
  630. CheckErrors($"未查询编号为【{no}】到培训营!");
  631. return null;
  632. }
  633. var score = await GsRepository.GetAll().Where(a => a.GroupNo == no).OrderByDescending(a => a.RoundIndex)
  634. .FirstOrDefaultAsync();
  635. if (score == null)
  636. {
  637. return null;
  638. }
  639. var dto = ObjectMapper.Map<GroupScoreDto>(score);
  640. return dto;
  641. }
  642. /// <summary>
  643. /// 查询培训营得分
  644. /// </summary>
  645. /// <param name="no"></param>
  646. /// <returns></returns>
  647. public async Task<List<QueryGroupScoreDto>> GetScoreInfo(string no)
  648. {
  649. var score = await GsRepository.GetAllIncluding(a => a.CampGroupInfo, a => a.CampGroupInfo.CampInfo).Where(a => a.CampNo == no).OrderByDescending(a => a.RoundIndex).Select(a => new QueryGroupScoreDto()
  650. {
  651. GroupNo = a.GroupNo,
  652. GroupName = a.CampGroupInfo.Name,
  653. CampNo = a.CampNo,
  654. RoundIndex = a.RoundIndex,
  655. SystemScore = a.FinalTotalScore,
  656. TotalScore = a.CampGroupInfo.CampInfo.RoundScore,
  657. BehaviorTagScoreInfo = a.BehaviorTagScoreInfo
  658. }).ToListAsync();
  659. return score;
  660. }
  661. }
  662. }