QueryAppService.cs 41 KB

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