QueryAppService.cs 49 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217
  1. using Abp.Application.Services.Dto;
  2. using Abp.Auditing;
  3. using Abp.Authorization;
  4. using Abp.Configuration;
  5. using Abp.Domain.Repositories;
  6. using Abp.Runtime.Caching;
  7. using IwbZero.AppServiceBase;
  8. using IwbZero.ToolCommon.LogHelpers;
  9. using IwbZero.ToolCommon.StringModel;
  10. using System;
  11. using System.Collections.Generic;
  12. using System.Data.Entity;
  13. using System.IO;
  14. using System.Linq;
  15. using System.Speech.Synthesis;
  16. using System.Threading;
  17. using System.Threading.Tasks;
  18. using System.Web.Mvc;
  19. using WeApp.Authorization.Users;
  20. using WeApp.BaseInfo;
  21. using WeApp.BaseSystem.Query.Dto;
  22. using WeApp.BaseSystem.Users.Dto;
  23. using WeApp.BasicInfo;
  24. using WeApp.BasicInfo.PhoneQuestion.Dto;
  25. using WeApp.BasicInfo.StudentTip.Dto;
  26. using WeApp.BasicInfo.TrainingRoleGroup.Dto;
  27. using WeApp.Configuration;
  28. using WeApp.Configuration.Cache;
  29. using WeApp.TrainingCamp;
  30. using WeApp.TrainingCamp.Dto;
  31. using WeApp.TrainingCampGroup.Dto;
  32. using WeApp.TrainingEval.Dto;
  33. using WeEngine.ModelInfo;
  34. using WeEngine.Packages;
  35. namespace WeApp.BaseSystem.Query
  36. {
  37. [AbpAllowAnonymous, DisableAuditing]
  38. public class QueryAppService : IwbAppServiceBase, IQueryAppService
  39. {
  40. #region 仓储
  41. public QueryAppService(
  42. 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, IRepository<PhoneAnswerInfo> answerRepository, IRepository<StudentTipInfo, string> stuTipRepository, IRepository<CampHelpInfo> campHelpRepository, IRepository<PhoneQuestionInfo, string> questionRepository)
  43. {
  44. UserRepository = userRepository;
  45. CampRepository = campRepository;
  46. GroupRepository = groupRepository;
  47. CgrRepository = cgrRepository;
  48. GrrRepository = grrRepository;
  49. GroupRoleRepository = groupRoleRepository;
  50. RoleRepository = roleRepository;
  51. GlRepository = glRepository;
  52. SceneMapRepository = sceneMapRepository;
  53. AttachRepository = attachRepository;
  54. GsRepository = gsRepository;
  55. PrRepository = prRepository;
  56. AnswerRepository = answerRepository;
  57. StuTipRepository = stuTipRepository;
  58. CampHelpRepository = campHelpRepository;
  59. QuestionRepository = questionRepository;
  60. }
  61. private string DataCenterUrl => IwbSettingNames.GetWeDataCenterIp(SettingManager).Ew("/");
  62. //private string EngineUrl => IwbSettingNames.GetWeEngineIp(SettingManager).Ew("/");
  63. protected IRepository<CampInfo, string> CampRepository { get; }
  64. protected IRepository<CampGroupInfo, string> GroupRepository { get; }
  65. protected IRepository<CampRelateGroupRoleInfo> CgrRepository { get; }
  66. protected IRepository<TrainingGroupRelateRoleInfo> GrrRepository { get; }
  67. protected IRepository<GroupRoleInfo> GroupRoleRepository { get; }
  68. protected IRepository<GroupScoreInfo> GsRepository { get; }
  69. protected IRepository<GroupLogInfo> GlRepository { get; }
  70. protected IRepository<TrainingRoleInfo, string> RoleRepository { get; }
  71. protected IRepository<User, long> UserRepository { get; }
  72. protected IRepository<PortraitRemarkInfo> PrRepository { get; }
  73. public IRepository<PhoneQuestionInfo, string> QuestionRepository { get; }
  74. public IRepository<PhoneAnswerInfo> AnswerRepository { get; }
  75. public IRepository<StudentTipInfo, string> StuTipRepository { get; }
  76. public IRepository<CampHelpInfo> CampHelpRepository { get; }
  77. protected IRepository<CampSceneMapInfo> SceneMapRepository { get; }
  78. protected IRepository<SysAttachFile> AttachRepository { get; }
  79. #endregion 仓储
  80. #region SELECT
  81. #region Camp && Group
  82. public async Task<List<SelectListItem>> GetCampStateSelectList()
  83. {
  84. var list = await StatesManager.GetSelectListAsync("Camp", "State");
  85. return list;
  86. }
  87. public async Task<string> GetCampStateSelectStr()
  88. {
  89. var str = await StatesManager.GetSelectListStrAsync("Camp", "State");
  90. str = "<option value=\"\" selected >请选择培训营状态.</option>" + str;
  91. return str;
  92. }
  93. public async Task<string> GetCampStateSelectStr(params string[] states)
  94. {
  95. var str = await StatesManager.GetSelectListStrAsync("Camp", "State", a => states.Contains(a.CodeValue));
  96. str = "<option value=\"\" selected >请选择培训营状态.</option>" + str;
  97. return str;
  98. }
  99. public async Task<List<SelectListItem>> GetCampGroupStateSelectList()
  100. {
  101. var list = await StatesManager.GetSelectListAsync("CampGroup", "State");
  102. return list;
  103. }
  104. public async Task<string> GetCampGroupStateSelectStr()
  105. {
  106. var str = await StatesManager.GetSelectListStrAsync("CampGroup", "State");
  107. return str;
  108. }
  109. /// <summary>
  110. /// 获取当前营的帮助信息[2.3版本已弃用]
  111. /// </summary>
  112. /// <param name="no"></param>
  113. /// <returns></returns>
  114. public async Task<string> GetStuHelpContentSelectStrByCamp(string no)
  115. {
  116. var list = await CampHelpRepository.GetAllIncluding(a => a.HelpInfo).Where(a => a.CampNo == no).Select(a => new
  117. {
  118. a.HelpInfo.Id,
  119. a.HelpInfo.Name,
  120. a.HelpInfo.Content
  121. }).ToListAsync();
  122. var str = "";//"<option value=\"\" selected >请选择帮助信息...</option>";
  123. foreach (var l in list)
  124. {
  125. str += $"<option value=\"{l.Id}\">{l.Content}</option>";
  126. }
  127. return str;
  128. }
  129. /// <summary>
  130. /// 获取当前情景角色的提示信息
  131. /// </summary>
  132. /// <param name="campNo"></param>
  133. /// <param name="sceneNo"></param>
  134. /// <param name="roleName"></param>
  135. /// <returns></returns>
  136. public async Task<string> GetStuTipsSelectStrByRoleScene(string campNo, string sceneNo, string roleName)
  137. {
  138. var list = await GetStuTipsByRoleScene(campNo, sceneNo, roleName);
  139. var str = "";
  140. foreach (var l in list)
  141. {
  142. str += $"<option value=\"{l.Id}\">{l.Content}</option>";
  143. }
  144. return str;
  145. }
  146. public async Task<string> GetCampSelectStr(params int[] states)
  147. {
  148. var list = await CampRepository.GetAllListAsync(a => states.Contains(a.CampState));
  149. var str = "<option value=\"\" selected >请选择演练培训营...</option>";
  150. foreach (var l in list)
  151. {
  152. str += $"<option value=\"{l.Id}\" >{l.Name}</option>";
  153. }
  154. return str;
  155. }
  156. public async Task<string> GetCampGroupSelectStr(string no)
  157. {
  158. var list = await GroupRepository.GetAllListAsync(a => a.CampNo == no);
  159. var str = "<option value=\"\" selected >请选择培训营分组...</option>";
  160. foreach (var l in list)
  161. {
  162. str += $"<option value=\"{l.Id}\" >{l.Name}</option>";
  163. }
  164. return str;
  165. }
  166. public async Task<string> GetGroupRoleSelectStr(string no)
  167. {
  168. var list = (await GroupRoleRepository.FirstOrDefaultAsync(a => a.GroupNo == no))?.RoleNames?.Split(',').ToList() ?? new List<string>();
  169. var str = "<option value=\"\" selected >请选择角色...</option>";
  170. foreach (var l in list)
  171. {
  172. str += $"<option value=\"{l}\" >{l}</option>";
  173. }
  174. return str;
  175. }
  176. #endregion Camp && Group
  177. public async Task<string> GetStuTipsSelectStr()
  178. {
  179. var list = await StuTipRepository.GetAllListAsync();
  180. var str = "<option value=\"\" selected >请选择情景提示...</option>";
  181. foreach (var l in list)
  182. {
  183. str += $"<option value=\"{l.Id}\" title=\"{l.Content}\" >{l.Name}</option>";
  184. }
  185. return str;
  186. }
  187. /// <summary>
  188. /// 获取问题
  189. /// </summary>
  190. /// <returns></returns>
  191. public async Task<string> GetQuestionsSelectStr()
  192. {
  193. var list = await QuestionRepository.GetAllListAsync();
  194. var str = "<option value=\"\" selected >请选择电话提问...</option>";
  195. foreach (var l in list)
  196. {
  197. str += $"<option value=\"{l.Id}\" title=\"{l.Content}\" >{l.Name}</option>";
  198. }
  199. return str;
  200. }
  201. /// <summary>
  202. /// PhoneQuestion类型
  203. /// </summary>
  204. /// <returns></returns>
  205. public async Task<string> GetQuestionTypeSelectStr()
  206. {
  207. var str = await StatesManager.GetSelectListStrAsync("PhoneQuestion", "Type");
  208. str = "<option value=\"\" selected >请选择问题类型...</option>" + str;
  209. return str;
  210. }
  211. /// <summary>
  212. /// PhoneQuestion类型
  213. /// </summary>
  214. /// <returns></returns>
  215. public async Task<string> GetAnswerTypeSelectStr()
  216. {
  217. var str = await StatesManager.GetSelectListStrAsync("PhoneAnswer", "Type");
  218. str = "<option value=\"\" selected >请选择答案类型...</option>" + str;
  219. return str;
  220. }
  221. /// <summary>
  222. /// 画像预置信息类型
  223. /// </summary>
  224. /// <returns></returns>
  225. public async Task<string> GetPortraitRemarkTypeSelectStr()
  226. {
  227. var str = await StatesManager.GetSelectListStrAsync("PortraitRemark", "Type");
  228. str = "<option value=\"\" selected >请选择信息类型...</option>" + str;
  229. return str;
  230. }
  231. #region 用户
  232. [DisableAuditing]
  233. public async Task<List<SelectListItem>> GetUserSelectList()
  234. {
  235. var list = await UserRepository.GetAllListAsync();
  236. var sList = new List<SelectListItem> { new SelectListItem { Text = @"请选择用户...", Value = "", Selected = true } };
  237. foreach (var l in list)
  238. {
  239. sList.Add(new SelectListItem { Value = l.Id + "", Text = l.Name });
  240. }
  241. return sList;
  242. }
  243. [DisableAuditing]
  244. public async Task<string> GetUserSelectStr()
  245. {
  246. var list = await UserRepository.GetAllListAsync();
  247. var str = "<option value=\"\" selected >请选择用户...</option>";
  248. foreach (var l in list)
  249. {
  250. str += $"<option value=\"{l.Id}\" >{l.Name}</option>";
  251. }
  252. return str;
  253. }
  254. //[DisableAuditing]
  255. //public async Task<string> GetCategorySelectStr()
  256. //{
  257. // var list = await CategoryRepository.GetAllListAsync();
  258. // string str = "";//"<option value=\"\" selected >请选择类别...</option>";
  259. // var tempParentNo = list.FirstOrDefault(a => a.ParentNo == null)?.Id ?? "";
  260. // foreach (var l in list)
  261. // {
  262. // var name = l.CategoryName;
  263. // var parentNo = l.ParentNo;
  264. // var id = l.Id;
  265. // if (l.ParentNo == null)
  266. // {
  267. // parentNo = "0";
  268. // id = "";
  269. // name = "请选择类别";
  270. // }
  271. // else if (l.ParentNo == tempParentNo)
  272. // {
  273. // parentNo = "";
  274. // }
  275. // str += $"<option parent=\"{parentNo}\" value=\"{id}\">{name}</option>";
  276. // }
  277. // return str;
  278. //}
  279. #endregion 用户
  280. #endregion SELECT
  281. /// <summary>
  282. /// 查询用户信息
  283. /// </summary>
  284. /// <param name="input"></param>
  285. /// <returns></returns>
  286. [DisableAuditing]
  287. public async Task<PagedResultDto<UserDto>> QueryUsers(IwbPagedRequestDto input)
  288. {
  289. var query = UserRepository.GetAll().Where(a => a.IsActive);
  290. query = ApplyFilter(query, input);
  291. var totalCount = await query.CountAsync();
  292. query = query.OrderBy(a => a.Id);
  293. query = query.Skip(input.SkipCount).Take(input.MaxResultCount);
  294. var entities = await query.ToListAsync();
  295. var dtoList = new PagedResultDto<UserDto>(totalCount, ObjectMapper.Map<List<UserDto>>(entities));
  296. return dtoList;
  297. }
  298. /// <summary>
  299. /// 查询培训营的分组
  300. /// </summary>
  301. /// <param name="no"></param>
  302. /// <returns></returns>
  303. [DisableAuditing]
  304. public async Task<List<CampGroupDto>> GetCampGroups(string no)
  305. {
  306. var query = await GroupRepository.GetAllListAsync(a => a.CampNo == no);
  307. var list = query.Select(ObjectMapper.Map<CampGroupDto>).ToList();
  308. return list;
  309. }
  310. /// <summary>
  311. /// 获取培训的角色组预案
  312. /// </summary>
  313. /// <param name="no"></param>
  314. /// <returns></returns>
  315. public async Task<List<TrainingRoleGroupDto>> GetCampRoleGroupInfos(string no)
  316. {
  317. var roleGroups = await CgrRepository.GetAllIncluding(a => a.TrainingRoleGroupInfo).Where(a => a.CampNo == no).Select(a => a.TrainingRoleGroupInfo).ToListAsync();
  318. var dtoList = new List<TrainingRoleGroupDto>();
  319. foreach (var roleGroup in roleGroups)
  320. {
  321. var dto = ObjectMapper.Map<TrainingRoleGroupDto>(roleGroup);
  322. var roles = GrrRepository.GetAllIncluding(a => a.TrainingRoleInfo).Where(a => a.RoleGroupNo == dto.Id);
  323. dto.RoleNos = roles.Select(a => a.TrainRoleNo).ToList();
  324. dto.RoleNames = string.Join(",", roles.Select(a => a.TrainingRoleInfo.RoleName).ToArray());
  325. dtoList.Add(dto);
  326. }
  327. return dtoList;
  328. }
  329. /// <summary>
  330. /// 获取当前情景角色的提示信息
  331. /// </summary>
  332. /// <param name="campNo"></param>
  333. /// <param name="sceneNo"></param>
  334. /// <param name="roleName"></param>
  335. /// <returns></returns>
  336. public async Task<List<StudentTipDto>> GetStuTipsByRoleScene(string campNo, string sceneNo, string roleName)
  337. {
  338. return await CacheManager.GetCache(IwbCacheNames.CampInfoCache).GetAsync(
  339. $"STU-TIP_{campNo}_{sceneNo}_{roleName}",
  340. async () =>
  341. {
  342. var sceneMap =
  343. await SceneMapRepository.FirstOrDefaultAsync(a => a.SceneNo == sceneNo && a.CampNo == campNo);
  344. var list = new List<StudentTipDto>();
  345. if (sceneMap != null)
  346. {
  347. list = await StuTipRepository.GetAll()
  348. .Where(a => sceneMap.TipNos.Contains(a.Id) && a.RoleName == roleName).Select(a => new StudentTipDto()
  349. {
  350. Content = a.Content,
  351. Id = a.Id,
  352. Name = a.Name,
  353. RoleName = a.RoleName
  354. })
  355. .ToListAsync();
  356. }
  357. return list;
  358. });
  359. }
  360. /// <summary>
  361. /// 获取问题
  362. /// </summary>
  363. /// <returns></returns>
  364. public async Task<List<PhoneQuestionDto>> GetQuestions()
  365. {
  366. var list = await QuestionRepository.GetAllListAsync();
  367. return list.Select(ObjectMapper.Map<PhoneQuestionDto>).ToList();
  368. }
  369. /// <summary>
  370. /// 获取问题
  371. /// </summary>
  372. /// <returns></returns>
  373. public async Task<PhoneQuestionDto> GetQuestion(string no)
  374. {
  375. var entity = await QuestionRepository.FirstOrDefaultAsync(a => a.Id == no);
  376. return ObjectMapper.Map<PhoneQuestionDto>(entity);
  377. }
  378. /// <summary>
  379. /// 获取日志的电话问题
  380. /// </summary>
  381. /// <returns></returns>
  382. public async Task<PhoneQuestionDto> GetQuestionByLog(int no)
  383. {
  384. var log = await GlRepository.FirstOrDefaultAsync(a => a.Id == no);
  385. var entity = await QuestionRepository.FirstOrDefaultAsync(a => a.Id == log.ExtendInfo1);
  386. return ObjectMapper.Map<PhoneQuestionDto>(entity);
  387. }
  388. /// <summary>
  389. /// 获取带电话问题的日志
  390. /// </summary>
  391. /// <returns></returns>
  392. public async Task<List<int>> GetQuestionLogs(string no)
  393. {
  394. var logs = await GlRepository.GetAll().Where(a => a.GroupNo == no && a.LogCommand == LogCommandDefinition.PhoneQuestion && string.IsNullOrEmpty(a.ExtendInfo4)).Select(a => a.Id).ToListAsync();
  395. return logs;
  396. }
  397. /// <summary>
  398. /// 获取问题的答案
  399. /// </summary>
  400. /// <param name="no"></param>
  401. /// <returns></returns>
  402. public async Task<List<PhoneAnswerDto>> GetQuestionAnswers(string no)
  403. {
  404. var list = await AnswerRepository.GetAllListAsync(a => a.QuestionNo == no);
  405. return list.Select(ObjectMapper.Map<PhoneAnswerDto>).ToList();
  406. }
  407. /// <summary>
  408. /// 获取培训营学员提示
  409. /// </summary>
  410. /// <param name="no"></param>
  411. /// <returns></returns>
  412. public async Task<List<string>> GetStuHelpStrByCamp(string no)
  413. {
  414. var list = await CampHelpRepository.GetAllIncluding(a => a.HelpInfo).Where(a => a.CampNo == no).Select(a => a.HelpInfo.Id).ToListAsync();
  415. return list;
  416. }
  417. /// <summary>
  418. /// 预加载
  419. /// </summary>
  420. /// <returns></returns>
  421. [DisableAuditing]
  422. public async Task LoadCampPre(string no, int type)
  423. {
  424. var camp = await GroupRepository.GetAllIncluding(a => a.CampInfo).Where(a => a.Id == no).Select(a => new CampDto { PackageNo = a.CampInfo.PackageNo }).FirstOrDefaultAsync();
  425. if (camp != null)
  426. {
  427. await Task.Run(() => { CacheManager.GetPackageDetail(camp.PackageNo, DataCenterUrl); });
  428. if (type != 0)
  429. {
  430. await Task.Run(() => { CacheManager.GetPackageDataNode(camp.PackageNo, DataCenterUrl); });
  431. }
  432. }
  433. }
  434. /// <summary>
  435. /// 查询培训营分组的演练角色
  436. /// </summary>
  437. /// <param name="no"></param>
  438. /// <returns></returns>
  439. public async Task<List<string>> GetGroupRoleInfos(string no)
  440. {
  441. var entity = await GroupRoleRepository.FirstOrDefaultAsync(a => a.GroupNo == no);
  442. var list = entity?.RoleNames?.Split(',').ToList() ?? new List<string>();
  443. return list;
  444. }
  445. /// <summary>
  446. /// 查询培训营分组的演练角色预案
  447. /// </summary>
  448. /// <param name="no"></param>
  449. /// <returns></returns>
  450. public async Task<GroupRolePlanDto> GetGroupRolePlans(string no)
  451. {
  452. return await CacheManager.GetCache(IwbCacheNames.GroupInfoCache).GetAsync($"Plan-{no}", async () =>
  453. {
  454. var entity = await GroupRoleRepository.FirstOrDefaultAsync(a => a.GroupNo == no);
  455. if (entity == null)
  456. {
  457. return null;
  458. }
  459. var plans = new List<RolePlanDto>();
  460. if (entity.RoleGroupNos != null)
  461. {
  462. var nos = entity.RoleGroupNos.Split(',');
  463. foreach (var n in nos)
  464. {
  465. var gr = await GrrRepository.GetAllIncluding(a => a.TrainingRoleInfo, a => a.RoleGroupInfo)
  466. .Where(a => a.RoleGroupNo == n).ToListAsync();
  467. if (gr.Any())
  468. {
  469. var name = gr[0].RoleGroupInfo.RoleGroupName;
  470. var roles = gr.Select(a => a.TrainingRoleInfo.RoleName).ToList();
  471. plans.Add(new RolePlanDto() { Name = name, RoleName = roles });
  472. }
  473. }
  474. }
  475. if (entity.CustomRoles.IsNotEmpty())
  476. {
  477. plans.Add(new RolePlanDto()
  478. {
  479. Name = "自定义角色",
  480. RoleName = entity.CustomRoles.Split(',').ToList()
  481. });
  482. }
  483. return new GroupRolePlanDto() { GroupNo = no, Plans = plans };
  484. });
  485. }
  486. /// <summary>
  487. /// 查询培训营情景路径
  488. /// </summary>
  489. /// <param name="no"></param>
  490. /// <returns></returns>
  491. public async Task<List<PackageDataNode>> GetCampRunningInfos(string no)
  492. {
  493. var groupNos = await GroupRepository.GetAll().Where(a => a.CampNo == no).Select(a => a.Id).ToListAsync();
  494. var list = new List<PackageDataNode>();
  495. if (groupNos.Any())
  496. {
  497. foreach (var groupNo in groupNos)
  498. {
  499. var runGroupInfo = await CacheManager.GetGroupRunningInfo(groupNo, GroupRepository);
  500. if (runGroupInfo != null)
  501. {
  502. list.Add(runGroupInfo);
  503. }
  504. }
  505. }
  506. return list;
  507. }
  508. /// <summary>
  509. /// 获取某组的情景路径
  510. /// </summary>
  511. /// <param name="no"></param>
  512. /// <returns></returns>
  513. public async Task<PackageDataNode> GetGroupRunningInfo(string no)
  514. {
  515. var runGroupInfo = await CacheManager.GetGroupRunningInfo(no, GroupRepository);
  516. return runGroupInfo;
  517. }
  518. //private RunningInfo GetRunningInfo(string no)
  519. //{
  520. // var url =
  521. // $"{EngineUrl}api/services/Engine/Run/QueryRunningInfo?runningId={no}";
  522. // var result = url.RequestPost("");
  523. // var info = result.Str2Obj<RunningInfo>();
  524. // return info;
  525. //}
  526. #region 日志
  527. /// <summary>
  528. /// 查询当前情景的处理日志
  529. /// </summary>
  530. /// <param name="no"></param>
  531. /// <returns></returns>
  532. [DisableAuditing]
  533. public async Task<List<GroupRoleLogDto>> GetCurrentSceneLog(string no)
  534. {
  535. var group = await GroupRepository.FirstOrDefaultAsync(a => a.Id == no);
  536. if (group == null)
  537. {
  538. CheckErrors($"未查询编号为【{no}】到培训营!");
  539. return null;
  540. }
  541. var query = GlRepository.GetAll().Where(a =>
  542. a.GroupNo == no && a.LogType == LogTypeDefinition.SceneOperation &&
  543. a.RoundIndex == group.RoundIndex &&
  544. (a.LogState == LogStateDefinition.New || a.LogState == LogStateDefinition.Submit || a.LogState == LogStateDefinition.HasMatch))
  545. .OrderByDescending(a => a.Id).Select(a => new GroupRoleLogDto()
  546. {
  547. Id = a.Id,
  548. GroupNo = no,
  549. Role = a.RoleName,
  550. Word = a.LogMessage,
  551. LogState = a.LogState,
  552. ScenePath = a.ScenePath,
  553. ExtendInfo1 = a.ExtendInfo1,
  554. ExtendInfo2 = a.ExtendInfo2,
  555. ExtendInfo3 = a.ExtendInfo3,
  556. ExtendInfo4 = a.ExtendInfo4,
  557. });
  558. var dtoList = await query.ToListAsync();
  559. return dtoList;
  560. }
  561. /// <summary>
  562. /// 查询培训营分组的处理日志
  563. /// </summary>
  564. /// <param name="no"></param>
  565. /// <returns></returns>
  566. public async Task<List<GroupRoleLogDto>> GetGroupLogs(string no)
  567. {
  568. var group = await GroupRepository.FirstOrDefaultAsync(a => a.Id == no);
  569. if (group == null)
  570. {
  571. CheckErrors($"未查询编号为【{no}】到培训营!");
  572. return null;
  573. }
  574. var query = GlRepository.GetAll().Where(a => a.GroupNo == no && a.LogType == LogTypeDefinition.SceneOperation)
  575. .OrderByDescending(a => a.Id).Select(a => new GroupRoleLogDto()
  576. {
  577. Id = a.Id,
  578. GroupNo = no,
  579. Role = a.RoleName,
  580. Word = a.LogMessage,
  581. LogState = a.LogState,
  582. ExtendInfo1 = a.ExtendInfo1,
  583. ExtendInfo2 = a.ExtendInfo2,
  584. ExtendInfo3 = a.ExtendInfo3,
  585. ExtendInfo4 = a.ExtendInfo4,
  586. });
  587. var dtoList = await query.ToListAsync();
  588. return dtoList;
  589. }
  590. /// <summary>
  591. /// 获取系统日志
  592. /// </summary>
  593. /// <param name="no"></param>
  594. /// <returns></returns>
  595. public async Task<List<QueryLogDto>> GetCampLogs(string no)
  596. {
  597. var dtoList = await GlRepository.GetAllIncluding(a => a.CampGroupInfo).Where(a => a.CampNo == no && a.LogType == LogTypeDefinition.System)
  598. .OrderBy(a => a.Id).Select(a => new QueryLogDto()
  599. {
  600. Name = a.CampGroupInfo != null ? a.CampGroupInfo.Name : "系统",
  601. Msg = a.LogCommand,
  602. Date = a.CreationTime
  603. }).ToListAsync();
  604. return dtoList;
  605. }
  606. /// <summary>
  607. /// 获取专家的问题
  608. /// </summary>
  609. /// <param name="id"></param>
  610. /// <returns></returns>
  611. public async Task<string> GetQuestionById(int id)
  612. {
  613. var log = await GlRepository.FirstOrDefaultAsync(a => a.Id == id);
  614. return log.LogMessage ?? "";
  615. }
  616. /// <summary>
  617. /// 获取专家的问题
  618. /// </summary>
  619. /// <param name="groupNo"></param>
  620. /// <param name="campNo"></param>
  621. /// <returns></returns>
  622. public async Task<List<OpSpecialistQuestionDto>> GetQuestionsByGroup(string groupNo, string campNo)
  623. {
  624. var list = await GlRepository.GetAll().Where(a =>
  625. a.CampNo == campNo && (a.GroupNo == null || a.GroupNo == groupNo)
  626. && a.LogCommand == LogCommandDefinition.SpecialistQuestion).Select(a =>
  627. new OpSpecialistQuestionDto
  628. {
  629. Id = a.Id,
  630. Question = a.LogMessage,
  631. }).ToListAsync();
  632. var logs = new List<OpSpecialistQuestionDto>();
  633. foreach (var item in list)
  634. {
  635. var answers = await GlRepository.GetAll().Where(a => a.ParentNo == item.Id + "" && a.GroupNo == groupNo).Select(a => new OpSpecialistAnswerDto()
  636. {
  637. Id = a.Id,
  638. Answer = a.LogMessage,
  639. GroupNo = a.GroupNo,
  640. GroupName = a.ExtendInfo1,
  641. }).ToListAsync();
  642. item.Answers = answers;
  643. logs.Add(item);
  644. }
  645. return logs.OrderByDescending(a => a.Id).ToList(); ;
  646. }
  647. /// <summary>
  648. /// 获取专家问答信息
  649. /// </summary>
  650. /// <param name="campNo"></param>
  651. /// <returns></returns>
  652. public async Task<List<OpSpecialistQuestionDto>> GetQuestionAndAnswerByCamp(string campNo)
  653. {
  654. var list = await GlRepository.GetAllIncluding(a => a.CampGroupInfo).Where(a => a.CampNo == campNo && a.LogCommand == LogCommandDefinition.SpecialistQuestion).Select(a =>
  655. new OpSpecialistQuestionDto
  656. {
  657. Id = a.Id,
  658. GroupName = a.GroupNo == null ? "全部分组" : a.CampGroupInfo.Name,
  659. Question = a.LogMessage,
  660. }).ToListAsync();
  661. foreach (var item in list)
  662. {
  663. var answers = await GlRepository.GetAll().Where(a => a.ParentNo == item.Id + "").Select(a =>
  664. new OpSpecialistAnswerDto()
  665. {
  666. Id = a.Id,
  667. GroupNo = a.GroupNo,
  668. GroupName = a.ExtendInfo1,
  669. Answer = a.LogMessage,
  670. }).ToListAsync();
  671. item.Answers = answers;
  672. }
  673. return list.OrderByDescending(a => a.Id).ToList();
  674. }
  675. #endregion 日志
  676. #region 情景
  677. /// <summary>
  678. /// 获取分组当前运行中的情景
  679. /// </summary>
  680. /// <param name="no"></param>
  681. /// <returns></returns>
  682. public async Task<List<SceneDto>> GetGroupRunningScenes(string no)
  683. {
  684. var group = await GroupRepository.FirstOrDefaultAsync(a => a.Id == no);
  685. if (group == null)
  686. {
  687. CheckErrors($"未查询编号为【{no}】到培训营!");
  688. return null;
  689. }
  690. List<SceneDto> list = new List<SceneDto>();
  691. var runGroupInfo = await CacheManager.GetGroupRunningInfo(no, GroupRepository);
  692. if (runGroupInfo == null)
  693. {
  694. return list;
  695. }
  696. var runRound = runGroupInfo.Children?.FirstOrDefault(a => a.IsStart && !a.IsEnd);
  697. if (runRound != null)
  698. {
  699. var runBlocks = runRound.Children?.Where(a => a.IsStart && !a.IsEnd).OrderBy(a => a.Id);
  700. if (runBlocks != null)
  701. {
  702. foreach (var b in runBlocks)
  703. {
  704. var runFlows = b.Children?.Where(a => a.IsStart && !a.IsEnd).OrderBy(a => a.Id);
  705. if (runFlows != null)
  706. foreach (var f in runFlows)
  707. {
  708. var runNodes = f.Children?.Where(a => a.IsStart).OrderBy(a => a.Id);
  709. if (runNodes != null)
  710. foreach (var node in runNodes)
  711. {
  712. list = await GetSceneFromNode(list, node, no, true);
  713. }
  714. }
  715. }
  716. }
  717. }
  718. return list;
  719. }
  720. /// <summary>
  721. /// 获取分组情景
  722. /// </summary>
  723. /// <param name="no"></param>
  724. /// <returns></returns>
  725. public async Task<List<SceneDto>> GetGroupScenes(string no)
  726. {
  727. var group = await GroupRepository.FirstOrDefaultAsync(a => a.Id == no);
  728. if (group == null)
  729. {
  730. CheckErrors($"未查询编号为【{no}】到培训营!");
  731. return null;
  732. }
  733. List<SceneDto> list = new List<SceneDto>();
  734. //var pathDto = (ScenePathDto)(await CacheManager.GetCache(IwbCacheNames.SceneInfoCache)
  735. // .GetOrDefaultAsync($"SceneNos-{no}"));
  736. //if (pathDto != null)
  737. //{
  738. // list = (List<SceneDto>)await CacheManager.GetCache(IwbCacheNames.SceneInfoCache).GetOrDefaultAsync($"SceneInfos-{no}");
  739. // if (pathDto.hasChange || list == null || list.Count == 0)
  740. // {
  741. // pathDto.hasChange = false;
  742. // await CacheManager.GetCache(IwbCacheNames.SceneInfoCache).SetAsync($"SceneNos-{no}", pathDto);
  743. // list = new List<SceneDto>();
  744. // foreach (var path in pathDto.PathList)
  745. // {
  746. // var scene = await GetSceneInfo_Last(no, path);
  747. // if (scene != null)
  748. // {
  749. // list.Add(scene);
  750. // }
  751. // }
  752. // await CacheManager.GetCache(IwbCacheNames.SceneInfoCache).SetAsync($"SceneInfos-{no}", list);
  753. // }
  754. //}
  755. //else
  756. //{
  757. //}
  758. var runGroupInfo = await CacheManager.GetGroupRunningInfo(no, GroupRepository);
  759. if (runGroupInfo == null)
  760. {
  761. return list;
  762. }
  763. var runRounds = runGroupInfo.Children?.Where(a => a.IsStart).OrderBy(a => a.Id);
  764. if (runRounds != null)
  765. foreach (var r in runRounds)
  766. {
  767. var runBlocks = r.Children?.Where(a => a.IsStart).OrderBy(a => a.Id);
  768. if (runBlocks != null)
  769. foreach (var b in runBlocks)
  770. {
  771. var runFlows = b.Children?.Where(a => a.IsStart).OrderBy(a => a.Id);
  772. if (runFlows != null)
  773. foreach (var f in runFlows)
  774. {
  775. var runNodes = f.Children?.Where(a => a.IsStart).OrderBy(a => a.Id);
  776. if (runNodes != null)
  777. foreach (var node in runNodes)
  778. {
  779. list = await GetSceneFromNode(list, node, no);
  780. }
  781. }
  782. }
  783. }
  784. //if (list.Any())
  785. //{
  786. // pathDto = new ScenePathDto()
  787. // {
  788. // hasChange = false,
  789. // PathList = list.Select(a => a.Path).ToList()
  790. // };
  791. // await CacheManager.GetCache(IwbCacheNames.SceneInfoCache).SetAsync($"SceneNos-{no}", pathDto);
  792. //}
  793. if (list.Any())
  794. {
  795. list = list.OrderByDescending(a => a.HasEnd).ToList();
  796. }
  797. return list;
  798. }
  799. /// <summary>
  800. /// 提取情景节点中的情景信息
  801. /// </summary>
  802. /// <param name="list"></param>
  803. /// <param name="node"></param>
  804. /// <param name="groupNo"></param>
  805. /// <param name="isRunningScene"></param>
  806. /// <returns></returns>
  807. private async Task<List<SceneDto>> GetSceneFromNode(List<SceneDto> list, FlowNodeDataNode node, string groupNo, bool isRunningScene = false)
  808. {
  809. if (node.SceneNodes != null)
  810. {
  811. if (!isRunningScene || !node.IsEnd)
  812. {
  813. foreach (var scene in node.SceneNodes)
  814. {
  815. var dto = await GetGroupSceneInfo(groupNo, scene.Path);
  816. if (dto != null)
  817. {
  818. dto.HasEnd = scene.IsEnd;
  819. list.Add(dto);
  820. }
  821. }
  822. }
  823. }
  824. var child = node.Children?.FirstOrDefault(a => a.IsStart);
  825. if (child != null)
  826. {
  827. list = await GetSceneFromNode(list, child, groupNo, isRunningScene);
  828. }
  829. return list;
  830. }
  831. private async Task<SceneDto> GetSceneInfo_Last(string no, string scenePath)
  832. {
  833. var dto = CacheManager.GetCache(IwbCacheNames.SceneInfoCache)
  834. .Get($"{no}-{scenePath}-end", () => default(SceneDto));
  835. if (dto == null)
  836. {
  837. await CacheManager.GetCache(IwbCacheNames.SceneInfoCache).RemoveAsync($"{no}-{scenePath}");
  838. dto = await GetGroupSceneInfo(no, scenePath);
  839. }
  840. return dto;
  841. }
  842. /// <summary>
  843. /// 查询情景信息
  844. /// </summary>
  845. /// <param name="no"></param>
  846. /// <param name="scenePath"></param>
  847. /// <returns></returns>
  848. [DisableAuditing]
  849. public async Task<SceneDto> GetGroupSceneInfo(string no, string scenePath)
  850. {
  851. //Stopwatch stopwatch = new Stopwatch();
  852. //Stopwatch stopwatch2 = new Stopwatch();
  853. //stopwatch.Start();
  854. //stopwatch2.Start();
  855. var groupCampNo = await GroupRepository.GetAll().Where(a => a.Id == no).Select(a => a.CampNo).FirstOrDefaultAsync();
  856. if (groupCampNo == null)
  857. {
  858. CheckErrors($"未查询编号为【{no}】到培训营!");
  859. return null;
  860. }
  861. var sceneDto = await CacheManager.GetCache(IwbCacheNames.SceneInfoCache).GetAsync($"{no}-{scenePath}",
  862. async () =>
  863. {
  864. SceneDto dto = null;
  865. try
  866. {
  867. var detail = await CacheManager.GetCampPackageDetail(groupCampNo, DataCenterUrl, CampRepository);
  868. var scene = detail?.Scenes.FirstOrDefault(a => a.Path == scenePath);
  869. if (scene == null)
  870. {
  871. return null;
  872. }
  873. dto = scene.Obj2String().Str2Obj<SceneDto>();
  874. //var runGroupInfo = await CacheManager.GetGroupRunningInfo(no, GroupRepository);
  875. //if (runGroupInfo == null)
  876. //{
  877. // return null;
  878. //}
  879. //var runScene = runGroupInfo.RunSceneInfos.FirstOrDefault(a => a.Path == scene.Path);
  880. //stopwatch.Stop();
  881. //this.LogInfo($"1耗时{scenePath}:{stopwatch.ElapsedMilliseconds}毫秒");
  882. //stopwatch.Restart();
  883. var runScene = await GetRunScene(no, scene);
  884. if (runScene != null)
  885. {
  886. dto.HasEnd = runScene.IsEnd;
  887. dto.Variables = dto.Variables.MergeHashtable(runScene.GetVariables());
  888. }
  889. //stopwatch.Stop();
  890. //this.LogInfo($"2耗时{scenePath}:{stopwatch.ElapsedMilliseconds}毫秒");
  891. //stopwatch.Restart();
  892. var gList = new List<GuideModel>();
  893. if (scene.GuideNos.IsNotEmpty())
  894. {
  895. var arr = scene.GuideNos.Split(',');
  896. foreach (var gNo in arr)
  897. {
  898. var g = detail.Guides?.FirstOrDefault(a => a.Id == gNo);
  899. if (g != null)
  900. {
  901. gList.Add(g);
  902. }
  903. }
  904. }
  905. dto.GuideInfos = gList;
  906. var attachList =
  907. await CacheManager.GetSceneAttaches(groupCampNo, scene.Id, SceneMapRepository, AttachRepository);
  908. dto.Attaches = attachList;
  909. }
  910. catch (Exception e)
  911. {
  912. this.LogError(e);
  913. }
  914. //stopwatch2.Stop();
  915. //this.LogInfo($"【总耗时】:{stopwatch2.ElapsedMilliseconds}毫秒");
  916. return dto;
  917. });
  918. if (sceneDto != null && sceneDto.HasEnd)
  919. {
  920. await CacheManager.GetCache(IwbCacheNames.SceneInfoCache).SetAsync($"{no}-{scenePath}-end", sceneDto);
  921. }
  922. return sceneDto;
  923. }
  924. private async Task<SceneDataNode> GetRunScene(string no, SceneModel scene)
  925. {
  926. SceneDataNode runScene = null;
  927. var i = 0;
  928. while (runScene == null && i < 5)
  929. {
  930. var runGroupInfo = await CacheManager.GetGroupRunningInfo(no, GroupRepository);
  931. runScene = runGroupInfo?.RunSceneInfos.FirstOrDefault(a => a.Path == scene.Path);
  932. i++;
  933. //if (runScene == null)
  934. //{
  935. // await CacheManager.GetCache(IwbCacheNames.GroupRunningInfoCache).RemoveAsync(no);
  936. // Thread.Sleep(500 * i);
  937. //}
  938. int time = 400 - i * 50;
  939. time = time > 0 ? time : 50;
  940. Thread.Sleep(time);
  941. }
  942. return runScene;
  943. }
  944. #endregion 情景
  945. /// <summary>
  946. /// 查询分组当前轮次得分
  947. /// </summary>
  948. /// <param name="no"></param>
  949. /// <returns></returns>
  950. [DisableAuditing]
  951. public async Task<GroupScoreDto> GetGroupScoreInfo(string no)
  952. {
  953. var group = await GroupRepository.FirstOrDefaultAsync(a => a.Id == no);
  954. if (group == null)
  955. {
  956. CheckErrors($"未查询编号为【{no}】到培训营!");
  957. return null;
  958. }
  959. var score = await GsRepository.GetAll().Where(a => a.GroupNo == no).OrderByDescending(a => a.RoundIndex)
  960. .FirstOrDefaultAsync();
  961. if (score == null)
  962. {
  963. return null;
  964. }
  965. var dto = ObjectMapper.Map<GroupScoreDto>(score);
  966. return dto;
  967. }
  968. /// <summary>
  969. /// 查询培训营得分
  970. /// </summary>
  971. /// <param name="no"></param>
  972. /// <returns></returns>
  973. public async Task<List<QueryGroupScoreDto>> GetScoreInfo(string no)
  974. {
  975. var scores = await GsRepository.GetAllIncluding(a => a.CampGroupInfo, a => a.CampGroupInfo.CampInfo)
  976. .Where(a => a.CampNo == no).OrderBy(a => a.GroupNo).ThenBy(a => a.RoundIndex).Select(a => new QueryGroupScoreDto()
  977. {
  978. GroupNo = a.GroupNo,
  979. GroupName = a.CampGroupInfo.Name,
  980. CampNo = a.CampNo,
  981. RoundIndex = a.RoundIndex,
  982. SystemScore = a.FinalTotalScore != 0 ? a.FinalTotalScore : a.SystemScore,
  983. TotalScore = a.CampGroupInfo.CampInfo.RoundScore,
  984. BehaviorTagScoreInfo = a.BehaviorTagScoreInfo
  985. }).ToListAsync();
  986. return scores;
  987. }
  988. /// <summary>
  989. /// 查询培训营得分
  990. /// </summary>
  991. /// <param name="no"></param>
  992. /// <returns></returns>
  993. public async Task<List<QueryGroupScoreDto>> GetScoreChart(string no)
  994. {
  995. var scores = await GsRepository.GetAllIncluding(a => a.CampGroupInfo, a => a.CampGroupInfo.CampInfo)
  996. .Where(a => a.CampNo == no).OrderBy(a => a.GroupNo).ThenBy(a => a.RoundIndex).Select(a => new QueryGroupScoreDto()
  997. {
  998. GroupNo = a.GroupNo,
  999. GroupName = a.CampGroupInfo.Name,
  1000. CampNo = a.CampNo,
  1001. RoundIndex = a.RoundIndex,
  1002. SystemScore = a.FinalTotalScore > 0 ? a.FinalTotalScore : a.CorrectionScore > 0 ? a.CorrectionScore : a.SystemScore,
  1003. TotalScore = a.CampGroupInfo.CampInfo.RoundScore,
  1004. BehaviorTagScoreInfo = a.BehaviorTagScoreInfo
  1005. }).ToListAsync();
  1006. var groups = await GroupRepository.GetAllIncluding(a => a.CampInfo).Where(a => a.CampNo == no).ToListAsync();
  1007. var score = 0;//scores.Any(a => a.SystemScore > 0) ? 0 : 50;
  1008. var btsInfo = "[{\"tagNo\":\"对媒体\",\"systemScore\":0,\"totalScore\":10}," +
  1009. "{\"tagNo\":\"对上级\",\"systemScore\":0,\"totalScore\":10}," +
  1010. "{\"tagNo\":\"对下级\",\"systemScore\":0,\"totalScore\":10}," +
  1011. "{\"tagNo\":\"对相关单位\",\"systemScore\":0,\"totalScore\":10}," +
  1012. "{\"tagNo\":\"决策力\",\"systemScore\":8,\"totalScore\":10}," +
  1013. "{\"tagNo\":\"协调力\",\"systemScore\":8,\"totalScore\":10}," +
  1014. "{\"tagNo\":\"研判力\",\"systemScore\":8,\"totalScore\":10}," +
  1015. "{\"tagNo\":\"舆论引导力\",\"systemScore\":8,\"totalScore\":10}," +
  1016. "{\"tagNo\":\"掌控力\",\"systemScore\":8,\"totalScore\":10}]";
  1017. foreach (var group in groups)
  1018. {
  1019. for (int i = 1; i <= 3; i++)
  1020. {
  1021. //if (!scores.Any(a => a.GroupNo == group.Id && a.RoundIndex == group.RoundIndex))
  1022. var scoreDto = scores.FirstOrDefault(a => a.GroupNo == group.Id && a.RoundIndex == i);
  1023. if (scoreDto == null)
  1024. {
  1025. scores.Add(new QueryGroupScoreDto()
  1026. {
  1027. GroupNo = group.Id,
  1028. GroupName = group.Name,
  1029. CampNo = group.CampNo,
  1030. RoundIndex = i,
  1031. SystemScore = score,
  1032. TotalScore = group.CampInfo.RoundScore,
  1033. BehaviorTagScoreInfo = btsInfo
  1034. });
  1035. }
  1036. else
  1037. {
  1038. if (scoreDto.BehaviorTagScoreInfo.IsEmpty())
  1039. {
  1040. scoreDto.BehaviorTagScoreInfo = btsInfo;
  1041. }
  1042. }
  1043. }
  1044. }
  1045. return scores.OrderBy(a => a.GroupNo).ToList();
  1046. }
  1047. /// <summary>
  1048. /// 查询培训营处理日志统计
  1049. /// </summary>
  1050. /// <param name="no"></param>
  1051. /// <returns></returns>
  1052. public async Task<List<ChartLogDto>> GetCampLogChart(string no)
  1053. {
  1054. var list = await GlRepository.GetAllIncluding(a => a.CampGroupInfo)
  1055. .Where(a => a.CampNo == no && a.LogType == LogTypeDefinition.SceneOperation).Select(a => new GroupRoleLogDto
  1056. {
  1057. GroupNo = a.GroupNo,
  1058. GroupName = a.CampGroupInfo.Name,
  1059. LogState = a.LogState,
  1060. }).ToListAsync();
  1061. var dtoList = list.GroupBy(a => a.GroupNo).Select(a => new ChartLogDto()
  1062. {
  1063. GroupNo = a.Key,
  1064. GroupName = a.FirstOrDefault()?.GroupName,
  1065. Matched = a.Count(s => s.LogState == LogStateDefinition.HasMatch || s.LogState == LogStateDefinition.HasSendMatch),
  1066. NotMatched = a.Count(s => s.LogState == LogStateDefinition.Send || s.LogState == LogStateDefinition.Submit)
  1067. }).ToList();
  1068. var groups = await GroupRepository.GetAllListAsync((a => a.CampNo == no));
  1069. foreach (var group in groups)
  1070. {
  1071. if (dtoList.All(a => a.GroupNo != group.Id))
  1072. {
  1073. dtoList.Add(new ChartLogDto()
  1074. {
  1075. GroupNo = group.Id,
  1076. GroupName = group.Name,
  1077. Matched = 0,
  1078. NotMatched = 0,
  1079. });
  1080. }
  1081. }
  1082. return dtoList.OrderBy(a => a.GroupNo).ToList();
  1083. }
  1084. public async Task<StepList.StepInfo> GetCampStep(string no)
  1085. {
  1086. var log = await GlRepository.GetAll()
  1087. .Where(a => a.CampNo == no && a.LogCommand == LogCommandDefinition.Step)
  1088. .OrderByDescending(a => a.CreationTime).FirstOrDefaultAsync();
  1089. var dto = log?.LogMessage.Str2Obj<StepList.StepInfo>();
  1090. return dto;
  1091. }
  1092. public async Task<string> Voice(string txt, int? rate = null, int? vol = null)
  1093. {
  1094. string fileName = $"{DateTime.Now:yyyyMMddHHmmssfff}.wav",
  1095. filePath =
  1096. $"/{await SettingManager.GetSettingValueAsync(IwbSettingNames.DownloadPath)}/Voice",
  1097. fullPath = $"{AppDomain.CurrentDomain.BaseDirectory}/{filePath}";
  1098. if (!Directory.Exists(fullPath))
  1099. {
  1100. Directory.CreateDirectory(fullPath);
  1101. }
  1102. var task = Task.Run(() =>
  1103. {
  1104. using (var sp = new SpeechSynthesizer())
  1105. using (MemoryStream ms = new MemoryStream())
  1106. {
  1107. sp.Rate = rate ?? 0;
  1108. sp.Volume = vol ?? 90;
  1109. //sp.SetOutputToWaveStream(ms);
  1110. sp.SetOutputToWaveFile($"{fullPath}/{fileName}");
  1111. Prompt prompt = new Prompt(txt);
  1112. sp.Speak(prompt);
  1113. ms.Position = 0;
  1114. }
  1115. });
  1116. Task.WaitAll(task);
  1117. return $"{filePath}/{fileName}";
  1118. }
  1119. }
  1120. }