PortraitAppService.cs 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657
  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.Tasks;
  7. using System.Web.Mvc;
  8. using Abp.Auditing;
  9. using Abp.Authorization;
  10. using Abp.Configuration;
  11. using Abp.Domain.Repositories;
  12. using Abp.Runtime.Caching;
  13. using IwbZero.Auditing;
  14. using IwbZero.ToolCommon.LogHelpers;
  15. using IwbZero.ToolCommon.StringModel;
  16. using WeApp.Authorization;
  17. using WeApp.BaseSystem.Query;
  18. using WeApp.Configuration;
  19. using WeApp.Configuration.Cache;
  20. using WeApp.TrainingCamp;
  21. using WeApp.TrainingPortrait.Dto;
  22. using WeEngine.CommonDto;
  23. using WeEngine.CommonDto.PortraitDto;
  24. using WeEngine.CommonDto.ReportDto;
  25. using WeEngine.Packages;
  26. namespace WeApp.TrainingPortrait
  27. {
  28. [AbpAuthorize, AuditLog("演练培训营画像")]
  29. public class PortraitAppService : IwbAppServiceBase, IPortraitAppService
  30. {
  31. public PortraitAppService(IRepository<CampInfo, string> campRepository, ICacheManager cacheManager, IRepository<CampGroupInfo, string> groupRepository, IRepository<GroupPortraitInfo> portraitRepository, IRepository<GroupLogInfo> glRepository, IRepository<GroupScoreInfo> gsRepository, QueryAppService queryApp)
  32. {
  33. CampRepository = campRepository;
  34. GroupRepository = groupRepository;
  35. PortraitRepository = portraitRepository;
  36. GlRepository = glRepository;
  37. GsRepository = gsRepository;
  38. QueryApp = queryApp;
  39. CacheManager = cacheManager;
  40. }
  41. private string DataCenterUrl => IwbSettingNames.GetWeDataCenterIp(SettingManager).Ew("/");
  42. protected IRepository<CampInfo, string> CampRepository { get; }
  43. protected IRepository<CampGroupInfo, string> GroupRepository { get; }
  44. protected IRepository<GroupPortraitInfo> PortraitRepository { get; }
  45. protected IRepository<GroupLogInfo> GlRepository { get; }
  46. protected IRepository<GroupScoreInfo> GsRepository { get; }
  47. protected QueryAppService QueryApp { get; }
  48. /// <summary>
  49. /// 更新画像说明
  50. /// </summary>
  51. /// <param name="input"></param>
  52. /// <returns></returns>
  53. public async Task UpdateRemark(UpdateRemarkDto input)
  54. {
  55. var entity = await PortraitRepository.GetAllIncluding(a => a.GroupInfo, a => a.GroupInfo.CampInfo)
  56. .FirstOrDefaultAsync(a => a.GroupNo == input.GroupNo);
  57. if (entity == null)
  58. {
  59. CheckErrors("演练画像还未生成!");
  60. return;
  61. }
  62. switch (input.Type)
  63. {
  64. case PortraitRemarkTypeDefinition.Scene:
  65. entity.SceneRemark = input.Remark;
  66. break;
  67. case PortraitRemarkTypeDefinition.SiGong:
  68. entity.SiGongRemark = input.Remark;
  69. break;
  70. case PortraitRemarkTypeDefinition.WuLi:
  71. entity.WuLiRemark = input.Remark;
  72. break;
  73. case PortraitRemarkTypeDefinition.Short:
  74. entity.ShortRemark = input.Remark;
  75. break;
  76. case PortraitRemarkTypeDefinition.ZhuanJia:
  77. entity.ZhuanJiaRemark = input.Remark;
  78. break;
  79. }
  80. await PortraitRepository.UpdateAsync(entity);
  81. await CurrentUnitOfWork.SaveChangesAsync();
  82. //更新缓存
  83. var dto = await GenerateGroupPortrait(input.GroupNo);
  84. if (dto != null)
  85. {
  86. switch (input.Type)
  87. {
  88. case PortraitRemarkTypeDefinition.Scene:
  89. dto.SceneRemark = input.Remark;
  90. break;
  91. case PortraitRemarkTypeDefinition.SiGong:
  92. dto.SiGongRemark = input.Remark;
  93. break;
  94. case PortraitRemarkTypeDefinition.WuLi:
  95. dto.WuLiRemark = input.Remark;
  96. break;
  97. case PortraitRemarkTypeDefinition.Short:
  98. dto.ShortRemark = input.Remark;
  99. break;
  100. case PortraitRemarkTypeDefinition.ZhuanJia:
  101. dto.ZhuanJiaRemark = input.Remark;
  102. break;
  103. }
  104. }
  105. await CacheManager.GetCache(IwbCacheNames.CampPortraitInfoCache).SetAsync($"GP-{input.GroupNo}", dto);
  106. }
  107. /// <summary>
  108. /// 重新生成培训营画像
  109. /// </summary>
  110. /// <param name="no"></param>
  111. /// <returns></returns>
  112. [AbpAuthorize(PermissionNames.PagesTrainMgPortraitMgGenerate), AuditLog("重新生成画像")]
  113. public async Task CleanPortrait(string no)
  114. {
  115. var groups = await GroupRepository.GetAllListAsync(a => a.CampNo == no);
  116. foreach (var g in groups)
  117. {
  118. await CacheManager.GetCache(IwbCacheNames.CampPortraitInfoCache).RemoveAsync($"GP-{g.Id}");
  119. await CacheManager.GetCache(IwbCacheNames.CampPortraitInfoCache).RemoveAsync($"GR-{g.Id}");
  120. await CacheManager.GetCache(IwbCacheNames.CampPortraitInfoCache).RemoveAsync($"GT-{g.Id}");
  121. }
  122. }
  123. /// <summary>
  124. /// 生成分组画像
  125. /// </summary>
  126. /// <param name="no"></param>
  127. /// <returns></returns>
  128. [AbpAuthorize(PermissionNames.PagesTrainMgPortraitMgGenerate), AuditLog("生成画像")]
  129. public async Task<GroupPortraitDto> GenerateGroupPortrait(string no)
  130. {
  131. var group = await GroupRepository.GetAllIncluding(a => a.CampInfo)
  132. .FirstOrDefaultAsync(a => a.Id == no);
  133. return await GenerateGroupPortrait(group);
  134. }
  135. /// <summary>
  136. /// 查询演练报告基础信息
  137. /// </summary>
  138. /// <param name="no"></param>
  139. /// <returns></returns>
  140. [DisableAuditing]
  141. public async Task<GroupReportDto> GetGroupReportBase(string no)
  142. {
  143. var dto = await GroupRepository.GetAllIncluding(a => a.CampInfo).Where(a => a.Id == no).Select(a =>
  144. new GroupReportDto()
  145. {
  146. Id = a.Id,
  147. Name = a.Name,
  148. CampNo = a.CampNo,
  149. CampName = a.CampInfo.Name,
  150. PackageName = a.CampInfo.PackageName,
  151. StartDate = a.StartDate,
  152. EndDate = a.EngDate,
  153. TrainingMinute = a.TrainingMinute,
  154. }).FirstOrDefaultAsync();
  155. if (dto != null)
  156. {
  157. var roles = await QueryApp.GetGroupRoleInfos(no);
  158. dto.RoleNames = string.Join(",", roles);
  159. }
  160. return dto;
  161. }
  162. /// <summary>
  163. /// 查询演练数据
  164. /// </summary>
  165. /// <param name="no"></param>
  166. /// <returns></returns>
  167. [DisableAuditing, AllowAnonymous, AbpAllowAnonymous]
  168. public async Task<GroupReportDto> GetGroupReportData(string no)
  169. {
  170. var entity = await PortraitRepository.GetAllIncluding(a => a.GroupInfo, a => a.GroupInfo.CampInfo)
  171. .FirstOrDefaultAsync(a => a.GroupNo == no);
  172. var group = entity?.GroupInfo;
  173. if (entity == null || group == null)
  174. {
  175. return null;
  176. }
  177. return await CacheManager.GetCache(IwbCacheNames.CampPortraitInfoCache).GetAsync($"GR-{no}", async () =>
  178. {
  179. var dto = new GroupReportDto();
  180. var runningInfo = group.RunningInfo?.Str2Obj<PackageDataNode>();
  181. dto.EvalQualitativeResult = runningInfo?.EvalQualitativeResult;
  182. dto.ChartData = TrainingInfoFrom(runningInfo, no);
  183. var groupScores = await GsRepository.GetAllListAsync(a => a.GroupNo == no);
  184. dto.Scenes = await ReportRoundSceneDtoFrom(runningInfo, no, groupScores);
  185. dto.ScoreData = await RoundScoreDtoFrom(groupScores);
  186. dto.ReportEvalStrings = new List<ReportEvalString>()
  187. {
  188. // new ReportEvalString(PortraitRemarkTypeDefinition.Scene,entity.SceneRemark),
  189. new ReportEvalString(PortraitRemarkTypeDefinition.SiGong,entity.SiGongRemark),
  190. new ReportEvalString(PortraitRemarkTypeDefinition.WuLi,entity.WuLiRemark),
  191. new ReportEvalString(PortraitRemarkTypeDefinition.Short,entity.ShortRemark),
  192. new ReportEvalString(PortraitRemarkTypeDefinition.ZhuanJia,entity.ZhuanJiaRemark),
  193. };
  194. return dto;
  195. });
  196. }
  197. /// <summary>
  198. /// 生成分组画像
  199. /// </summary>
  200. /// <param name="group"></param>
  201. /// <returns></returns>
  202. private async Task<GroupPortraitDto> GenerateGroupPortrait(CampGroupInfo group)
  203. {
  204. return await CacheManager.GetCache(IwbCacheNames.CampPortraitInfoCache).GetAsync($"GP-{group.Id}", async () =>
  205. {
  206. try
  207. {
  208. var entity = await PortraitRepository.GetAllIncluding(a => a.GroupInfo, a => a.GroupInfo.CampInfo)
  209. .FirstOrDefaultAsync(a => a.GroupNo == group.Id);
  210. if (entity == null)
  211. {
  212. entity = new GroupPortraitInfo()
  213. {
  214. GroupNo = group.Id,
  215. CampNo = group.CampNo,
  216. };
  217. }
  218. var roleLogs = await GlRepository.GetAllListAsync(a =>
  219. a.GroupNo == group.Id && a.LogType == LogTypeDefinition.SceneOperation &&
  220. (a.LogState == LogStateDefinition.NotSend || a.LogState == LogStateDefinition.Send || a.LogState == LogStateDefinition.HasSendMatch));
  221. entity.CmdCount = roleLogs.Count;
  222. entity.RoleCount = roleLogs.GroupBy(a => a.RoleName).Count();
  223. entity.RoleCmdInfos = RoundRoleCmdDtoFrom(roleLogs).Obj2StringCamelCase();
  224. PackageDataNode runNode = group.RunningInfo?.Str2Obj<PackageDataNode>();
  225. //if (group.RunningInfo.Contains("PackageNo"))
  226. //{
  227. // var str = group.RunningInfo?
  228. // .Replace("\"PackageNo\"", "\"p\"")
  229. // .Replace("\"Children\"", "\"ch\"")
  230. // .Replace("\"Id\"", "\"i\"")
  231. // .Replace("\"No\"", "\"n\"")
  232. // .Replace("\"Name\"", "\"nm\"")
  233. // .Replace("\"Path\"", "\"p\"")
  234. // .Replace("\"Variables\"", "\"v\"")
  235. // .Replace("\"FullScore\"", "\"fs\"")
  236. // .Replace("\"CorrectionScore\"", "\"cs\"")
  237. // .Replace("\"SystemScore\"", "\"ss\"")
  238. // .Replace("\"IsStart\"", "\"r\"")
  239. // .Replace("\"IsEnd\"", "\"re\"")
  240. // .Replace("\"WaitPath\"", "\"W\"")
  241. // .Replace("\"CurrentRoundIndex\"", "\"cri\"")
  242. // .Replace("\"AssessRoles\"", "\"ar\"")
  243. // .Replace("\"AssessAuto\"", "\"aa\"")
  244. // .Replace("\"AutoNextRound\"", "\"anr\"")
  245. // .Replace("\"RoundScore\"", "\"rs\"")
  246. // .Replace("\"EvalQualitativeResult\"", "\"eqr\"")
  247. // .Replace("\"RoundIndex\"", "\"ri\"")
  248. // .Replace("\"BlockType\"", "\"bt\"")
  249. // .Replace("\"SceneNodes\"", "\"sn\"")
  250. // .Replace("\"BehaviorTagString\"", "\"bts\"")
  251. // .Replace("\"BehaviorTag\"", "\"bt\"")
  252. // .Replace("\"Keywords\"", "\"k\"");
  253. // runNode = str.Str2Obj<PackageDataNode>();
  254. //}
  255. var runningInfo = GetFullRunningInfo(runNode);
  256. entity.TrainingInfos = TrainingInfoFrom(runningInfo, group.Id).Obj2StringCamelCase();
  257. var roundScenes = await RoundSceneDtoFrom(runningInfo, group.Id);
  258. entity.SceneCount = roundScenes.Sum(a => a.SceneInfos.Count);
  259. entity.SceneInfos = roundScenes.Obj2StringCamelCase();
  260. var groupScores = await GsRepository.GetAllListAsync(a => a.GroupNo == group.Id);
  261. var roundScore = await RoundScoreDtoFrom(groupScores);
  262. entity.RoundScoreInfos = roundScore.ScoreInfos.Obj2StringCamelCase();
  263. entity.SiGongInfos = roundScore.SiGongInfos.Obj2StringCamelCase();
  264. entity.WuLiInfos = roundScore.WuLiInfos.Obj2StringCamelCase();
  265. await PortraitRepository.InsertOrUpdateAsync(entity);
  266. await CurrentUnitOfWork.SaveChangesAsync();
  267. return ObjectMapper.Map<GroupPortraitDto>(entity);
  268. }
  269. catch (Exception e)
  270. {
  271. Console.WriteLine(e);
  272. return null;
  273. }
  274. });
  275. }
  276. private PackageDataNode GetFullRunningInfo(PackageDataNode runningNode)
  277. {
  278. return CacheManager.GetCache(IwbCacheNames.CampPortraitInfoCache).Get($"RN_{runningNode.Id}", () =>
  279. {
  280. var pn = CacheManager.GetPackageDataNode(runningNode.PackageNo, DataCenterUrl);
  281. if (pn != null)
  282. {
  283. runningNode.MergeNode(pn);
  284. }
  285. return runningNode;
  286. });
  287. }
  288. private List<RoundRoleCmdDto> RoundRoleCmdDtoFrom(List<GroupLogInfo> logs)
  289. {
  290. var list = new List<RoundRoleCmdDto>();
  291. var roundLogs = logs.GroupBy(a => a.RoundIndex);
  292. foreach (var roundLog in roundLogs)
  293. {
  294. var roundIndex = roundLog.Key;
  295. var cmd = new RoundRoleCmdDto()
  296. {
  297. RoundIndex = roundIndex,
  298. RoleCmdInfos = RoleCmdDtoFrom(logs.Where(a => a.RoundIndex == roundIndex).ToList())
  299. };
  300. list.Add(cmd);
  301. }
  302. return list;
  303. }
  304. private List<RoleCmdDto> RoleCmdDtoFrom(List<GroupLogInfo> logs)
  305. {
  306. var list = new List<RoleCmdDto>();
  307. var roleLogs = logs.GroupBy(a => a.RoleName);
  308. foreach (var roleLog in roleLogs)
  309. {
  310. var roleName = roleLog.Key;
  311. var roleLogList = logs.Where(a => a.RoleName == roleName).ToList();
  312. var log = new RoleCmdDto()
  313. {
  314. RoleName = roleName,
  315. CmdInfo = new List<string>()
  316. };
  317. foreach (var l in roleLogList)
  318. {
  319. log.CmdInfo.Add($"{l.LogState}|{l.LogMessage}");
  320. }
  321. list.Add(log);
  322. }
  323. return list;
  324. }
  325. private async Task<List<RoundSceneDto>> RoundSceneDtoFrom(PackageDataNode runningInfo, string groupNo)
  326. {
  327. var list = new List<RoundSceneDto>();
  328. var roundInfos = runningInfo?.RunRoundInfos;
  329. if (roundInfos != null)
  330. {
  331. foreach (var roundInfo in roundInfos)
  332. {
  333. var roundScene = new RoundSceneDto() { RoundIndex = roundInfo.RoundIndex, SceneInfos = new List<SceneDto>() };
  334. if (roundInfo.RunSceneInfos != null)
  335. {
  336. foreach (var info in roundInfo.RunSceneInfos)
  337. {
  338. var scene = await QueryApp.GetGroupSceneInfo(groupNo, info.Path);
  339. roundScene.SceneInfos.Add(scene);
  340. }
  341. }
  342. list.Add(roundScene);
  343. }
  344. }
  345. return list;
  346. }
  347. private async Task<RoundScoreDto> RoundScoreDtoFrom(List<GroupScoreInfo> scoreInfos)
  348. {
  349. scoreInfos = scoreInfos.OrderBy(a => a.RoundIndex).ToList();
  350. var roundScore = new RoundScoreDto()
  351. {
  352. ScoreInfos = new List<decimal>(),
  353. SiGongInfos = new List<TagScoreDto>(),
  354. WuLiInfos = new List<TagScoreDto>()
  355. };
  356. var tags = await SettingManager.GetSettingValueAsync(IwbSettingNames.SiGongWuLiTag);
  357. var arr = tags.Split('|');
  358. if (arr.Length < 2)
  359. {
  360. return null;
  361. }
  362. var sgTagArr = arr[0].Split(',');
  363. var wlTagArr = arr[1].Split(',');
  364. foreach (var s in sgTagArr)
  365. {
  366. roundScore.SiGongInfos.Add(new TagScoreDto() { Name = s, TagScoreInfos = new List<decimal>() });
  367. }
  368. foreach (var s in wlTagArr)
  369. {
  370. roundScore.WuLiInfos.Add(new TagScoreDto() { Name = s, TagScoreInfos = new List<decimal>() });
  371. }
  372. foreach (var info in scoreInfos)
  373. {
  374. roundScore.ScoreInfos.Add(info.FinalTotalScore == 0 ? info.SystemScore : info.FinalTotalScore);
  375. var tagScores = info.BehaviorTagScoreInfo.Str2Obj<List<TagScoreInfo>>();
  376. foreach (var scoreInfo in tagScores)
  377. {
  378. var sg = roundScore.SiGongInfos.FirstOrDefault(a => a.Name == scoreInfo.TagNo);
  379. if (sg != null)
  380. {
  381. var score = scoreInfo.TotalScore == 0
  382. ? 0
  383. : (scoreInfo.CorrectionScore == 0
  384. ? scoreInfo.SystemScore
  385. : scoreInfo.CorrectionScore) * 100 / scoreInfo.TotalScore;
  386. score = Math.Round(score > 100 ? 100 : score, 2);
  387. sg.TagScoreInfos.Add(score);
  388. }
  389. var wl = roundScore.WuLiInfos.FirstOrDefault(a => a.Name == scoreInfo.TagNo);
  390. if (wl != null)
  391. {
  392. var score = scoreInfo.TotalScore == 0
  393. ? 0
  394. : (scoreInfo.CorrectionScore == 0
  395. ? scoreInfo.SystemScore
  396. : scoreInfo.CorrectionScore) * 100 / scoreInfo.TotalScore;
  397. score = Math.Round(score > 100 ? 100 : score, 2);
  398. wl.TagScoreInfos.Add(score);
  399. }
  400. }
  401. }
  402. return roundScore;
  403. }
  404. private List<TrainingRoundInfoDto> TrainingInfoFrom(PackageDataNode runningInfo, string groupNo)
  405. {
  406. return CacheManager.GetCache(IwbCacheNames.CampPortraitInfoCache).Get($"GT-{groupNo}", () =>
  407. {
  408. var dtoList = new List<TrainingRoundInfoDto>();
  409. var roundInfos = runningInfo?.RunRoundInfos;
  410. if (roundInfos != null)
  411. {
  412. foreach (var r in roundInfos)
  413. {
  414. var roundInfo = new TrainingRoundInfoDto(r.RoundIndex);
  415. var rt = new TrainingInfoDto($"第{r.RoundIndex}轮", r.Id, r.IsStart);
  416. foreach (var b in r.Children)
  417. {
  418. //var bt = new TrainingInfoDto($"情景块[{b.Path}]", b.Path,b.IsStart);
  419. foreach (var f in b.Children)
  420. {
  421. var ft = new TrainingInfoDto($"情景流[{f.Name}]", f.Id, f.IsStart);
  422. ft.Children.AddRange(TrainingInfoNodeFrom(f.Children) ?? new List<TrainingInfoDto>());
  423. rt.Children.Add(ft);
  424. }
  425. //rt.Children.Add(bt);
  426. }
  427. var flows = r.RunFlowInfos;
  428. foreach (var f2 in flows)
  429. {
  430. var fcFlow = FcFlowInfoFrom(f2.Children, new FcFlowInfoDto(f2.Name));
  431. roundInfo.AddFcFlowInfo(fcFlow);
  432. }
  433. roundInfo.Infos.Add(rt);
  434. dtoList.Add(roundInfo);
  435. }
  436. }
  437. return dtoList;
  438. });
  439. }
  440. private List<TrainingInfoDto> TrainingInfoNodeFrom(List<FlowNodeDataNode> nodes, int i = 0)
  441. {
  442. i++;
  443. var dtoList = new List<TrainingInfoDto>();
  444. if (nodes != null && nodes.Any())
  445. {
  446. foreach (var node in nodes)
  447. {
  448. var name = string.Join(",", node.SceneNodes.Select(a => a.Name).ToArray());
  449. var nt = new TrainingInfoDto($"情景{i}:{name}", node.Id, node.IsStart);
  450. if (node.Children != null && node.Children.Any())
  451. {
  452. nt.Children.AddRange(TrainingInfoNodeFrom(node.Children, i));
  453. }
  454. dtoList.Add(nt);
  455. }
  456. }
  457. return dtoList;
  458. }
  459. private FcFlowInfoDto FcFlowInfoFrom(List<FlowNodeDataNode> infos, FcFlowInfoDto fcFlow)
  460. {
  461. infos = infos.Where(a => a.IsStart).ToList();
  462. foreach (var info in infos)
  463. {
  464. var scenes = info.SceneNodes.Where(a => a.IsStart).ToList();
  465. foreach (var s in scenes)
  466. {
  467. fcFlow.FlowInfos.Add(new PointDto(s.Name));
  468. }
  469. if (info.Children != null && info.Children.Any())
  470. {
  471. fcFlow = FcFlowInfoFrom(info.Children, fcFlow);
  472. }
  473. }
  474. return fcFlow;
  475. }
  476. private async Task<List<ReportRoundSceneDto>> ReportRoundSceneDtoFrom(PackageDataNode runningInfo, string groupNo, List<GroupScoreInfo> scoreInfos)
  477. {
  478. var list = new List<ReportRoundSceneDto>();
  479. var roundInfos = runningInfo?.Children;
  480. if (roundInfos != null)
  481. {
  482. foreach (var roundInfo in roundInfos)
  483. {
  484. var roundScene = new ReportRoundSceneDto() { RoundIndex = roundInfo.RoundIndex, SceneInfos = new List<ReportSceneDto>() };
  485. if (roundInfo.RunSceneInfos != null)
  486. {
  487. foreach (var info in roundInfo.RunSceneInfos)
  488. {
  489. var scene = await GetGroupSceneInfoWithBehavior(groupNo, info.Id);
  490. roundScene.SceneInfos.Add(scene);
  491. }
  492. }
  493. var bTagList = new List<ReportBehaviorTagDto>();
  494. var scoreInfo = scoreInfos.FirstOrDefault(a => a.RoundIndex == roundInfo.RoundIndex);
  495. var tagScores = scoreInfo?.BehaviorTagScoreInfo.Str2Obj<List<TagScoreInfo>>();
  496. if (tagScores != null)
  497. {
  498. var tags = await SettingManager.GetSettingValueAsync(IwbSettingNames.SiGongWuLiTag);
  499. var setting = await SettingManager.GetSettingValueAsync(IwbSettingNames.ReportTagLevel);
  500. var arr = tags.Split('|');
  501. if (arr.Length < 2)
  502. {
  503. return null;
  504. }
  505. var sgTagArr = arr[0].Split(',');
  506. var wlTagArr = arr[1].Split(',');
  507. foreach (var s in sgTagArr)
  508. {
  509. var t = tagScores.FirstOrDefault(a => a.TagNo == s);
  510. bTagList.Add(t == null || t.TotalScore == 0
  511. ? new ReportBehaviorTagDto(s)
  512. : new ReportBehaviorTagDto(t, setting));
  513. }
  514. foreach (var s in wlTagArr)
  515. {
  516. var t = tagScores.FirstOrDefault(a => a.TagNo == s);
  517. bTagList.Add(t == null || t.TotalScore == 0 ? new ReportBehaviorTagDto(s) : new ReportBehaviorTagDto(t, setting));
  518. }
  519. }
  520. roundScene.BehaviorTags = bTagList;
  521. list.Add(roundScene);
  522. }
  523. }
  524. return list;
  525. }
  526. private async Task<ReportSceneDto> GetGroupSceneInfoWithBehavior(string no, string sceneNo)
  527. {
  528. var playInfo = await GroupRepository.FirstOrDefaultAsync(a => a.Id == no);
  529. if (playInfo == null)
  530. {
  531. CheckErrors($"未查询编号为【{no}】到培训营!");
  532. return null;
  533. }
  534. try
  535. {
  536. var detail = await CacheManager.GetCampPackageDetail(playInfo.CampNo, DataCenterUrl, CampRepository);
  537. var scene = detail?.Scenes.FirstOrDefault(a => a.Id == sceneNo);
  538. if (scene == null)
  539. {
  540. return null;
  541. }
  542. var runGroupInfo = await CacheManager.GetGroupRunningInfo(no, GroupRepository);
  543. if (runGroupInfo == null)
  544. {
  545. return null;
  546. }
  547. //var dto = ObjectMapper.Map<SceneDto>(scene);
  548. var runScene = runGroupInfo.RunSceneInfos.FirstOrDefault(a => a.Path == scene.Path);
  549. if (runScene != null)
  550. {
  551. //dto.HasEnd = runScene.IsEnd;
  552. scene.Variables = scene.Variables.MergeHashtable(runScene.GetVariables());
  553. //dto.Variables = scene.Variables;
  554. }
  555. var bList = new List<BehaviorDto>();
  556. if (scene.BehaviorNos.IsNotEmpty())
  557. {
  558. var arr = scene.BehaviorNos.Split(',');
  559. foreach (var s in arr)
  560. {
  561. var b = detail.Behaviors?.FirstOrDefault(a => a.Id == s);
  562. if (b != null)
  563. {
  564. var behavior = runGroupInfo.RunBehaviorInfos?.FirstOrDefault(a => a.Path == b.Path);
  565. if (behavior != null)
  566. {
  567. var bDto = new BehaviorDto(behavior)
  568. {
  569. Description = b.Description
  570. };
  571. bList.Add(bDto);
  572. }
  573. }
  574. }
  575. }
  576. var bTagList = new List<ReportBehaviorTagDto>();
  577. if (runScene?.BehaviorTagPer.Count > 0)
  578. {
  579. var tags = await SettingManager.GetSettingValueAsync(IwbSettingNames.SiGongWuLiTag);
  580. var setting = await SettingManager.GetSettingValueAsync(IwbSettingNames.ReportTagLevel);
  581. var arr = tags.Split('|');
  582. if (arr.Length < 2)
  583. {
  584. return null;
  585. }
  586. var sgTagArr = arr[0].Split(',');
  587. var wlTagArr = arr[1].Split(',');
  588. foreach (var s in sgTagArr)
  589. {
  590. var t = runScene.BehaviorTagPer.FirstOrDefault(a => a.TagNo == s);
  591. bTagList.Add(t == null ? new ReportBehaviorTagDto(s) : new ReportBehaviorTagDto(t, setting));
  592. }
  593. foreach (var s in wlTagArr)
  594. {
  595. var t = runScene.BehaviorTagPer.FirstOrDefault(a => a.TagNo == s);
  596. bTagList.Add(t == null ? new ReportBehaviorTagDto(s) : new ReportBehaviorTagDto(t, setting));
  597. }
  598. }
  599. var rDto = new ReportSceneDto(scene)
  600. {
  601. Behaviors = bList,
  602. BehaviorTags = bTagList
  603. };
  604. return rDto;
  605. }
  606. catch (Exception e)
  607. {
  608. this.LogError(e);
  609. }
  610. return null;
  611. }
  612. }
  613. }