EvalAppService.cs 52 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355
  1. using Abp.Auditing;
  2. using Abp.Authorization;
  3. using Abp.Configuration;
  4. using Abp.Domain.Repositories;
  5. using Abp.Runtime.Caching;
  6. using IwbZero.Auditing;
  7. using IwbZero.ToolCommon;
  8. using IwbZero.ToolCommon.StringModel;
  9. using Microsoft.AspNet.SignalR;
  10. using System;
  11. using System.Collections.Generic;
  12. using System.Data.Entity;
  13. using System.Linq;
  14. using System.Text.RegularExpressions;
  15. using System.Threading;
  16. using System.Threading.Tasks;
  17. using WeApp.BaseInfo;
  18. using WeApp.BasicInfo;
  19. using WeApp.CommonManager.MqttClient;
  20. using WeApp.Configuration;
  21. using WeApp.Configuration.Cache;
  22. using WeApp.Hubs;
  23. using WeApp.TrainingCamp;
  24. using WeApp.TrainingEval.Dto;
  25. using WeEngine.CommonDto;
  26. using WeEngine.Packages;
  27. namespace WeApp.TrainingEval
  28. {
  29. [AbpAuthorize, AuditLog("演练培训营评估")]
  30. public class EvalAppService : IwbAppServiceBase, IEvalAppService
  31. {
  32. public EvalAppService(IRepository<CampInfo, string> campRepository, IRepository<CampGroupInfo, string> groupRepository, IRepository<GroupScoreInfo> gsRepository, IRepository<GroupLogInfo> glRepository, ICacheManager cacheManager, IRepository<TrainingGroupRelateRoleInfo> grrRepository, IRepository<GroupRoleInfo> groupRoleRepository, IRepository<CampSceneMapInfo> sceneMapRepository, IRepository<SysAttachFile> attachRepository, WeAppMsgClientManager msgClientManager, IRepository<PhoneQuestionInfo, string> questionRepository, IRepository<PhoneAnswerInfo> answerRepository)
  33. {
  34. CampRepository = campRepository;
  35. GroupRepository = groupRepository;
  36. GsRepository = gsRepository;
  37. GlRepository = glRepository;
  38. GrrRepository = grrRepository;
  39. GroupRoleRepository = groupRoleRepository;
  40. SceneMapRepository = sceneMapRepository;
  41. AttachRepository = attachRepository;
  42. MsgClientManager = msgClientManager;
  43. QuestionRepository = questionRepository;
  44. AnswerRepository = answerRepository;
  45. CacheManager = cacheManager;
  46. IwbHubContext = GlobalHost.ConnectionManager.GetHubContext<IwbHub>();
  47. }
  48. //private string DataCenterUrl => SettingManager.GetSettingValue(IwbSettingNames.WeDataCenterIp).Ew("/");
  49. private string EngineApiUrl => SettingManager.GetSettingValue(IwbSettingNames.WeEngineIp).Ew("/");
  50. protected IHubContext IwbHubContext { get; }
  51. private bool HasReStart { get; set; }
  52. protected WeAppMsgClientManager MsgClientManager { get; }
  53. protected IRepository<CampInfo, string> CampRepository { get; }
  54. protected IRepository<CampGroupInfo, string> GroupRepository { get; }
  55. protected IRepository<GroupScoreInfo> GsRepository { get; }
  56. protected IRepository<GroupLogInfo> GlRepository { get; }
  57. protected IRepository<TrainingGroupRelateRoleInfo> GrrRepository { get; }
  58. protected IRepository<GroupRoleInfo> GroupRoleRepository { get; }
  59. protected IRepository<CampSceneMapInfo> SceneMapRepository { get; }
  60. protected IRepository<SysAttachFile> AttachRepository { get; }
  61. protected IRepository<PhoneQuestionInfo, string> QuestionRepository { get; }
  62. protected IRepository<PhoneAnswerInfo> AnswerRepository { get; }
  63. #region Operation
  64. /// <summary>
  65. /// 进入演练页面成功后反馈
  66. /// </summary>
  67. /// <param name="no"></param>
  68. [AbpAllowAnonymous]
  69. public bool StartFeedback(string no)
  70. {
  71. return WeAppMsgClientManager.StartPushScene(no);
  72. }
  73. /// <summary>
  74. /// 启动培训营
  75. /// </summary>
  76. /// <param name="campNo"></param>
  77. /// <param name="groupNo"></param>
  78. /// <returns></returns>
  79. [AuditLog("启动培训营")]
  80. public async Task StartCamp(string campNo, string groupNo)
  81. {
  82. CampInfo camp;
  83. List<string> groupNos = new List<string>();
  84. CampGroupInfo group = null;
  85. if (groupNo == "none")
  86. {
  87. camp = await CampRepository.FirstOrDefaultAsync(a => a.Id == campNo);
  88. if (camp.CampState == CampStateDefinition.Run)
  89. {
  90. CheckErrors("培训营已运行,不能操作!");
  91. }
  92. var groups = await GroupRepository.GetAll().Where(a => a.CampNo == campNo).OrderBy(a => a.Id).ToListAsync();
  93. foreach (var g in groups)
  94. {
  95. if (g.CampGroupState >= CampGroupStateDefinition.Run &&
  96. g.CampGroupState < CampGroupStateDefinition.Ready)
  97. {
  98. continue;
  99. }
  100. group = g;
  101. groupNos.Add(g.Id);
  102. WeAppMsgClientManager.StopPushScene(g.Id);
  103. await WriteLog(g.CampNo, g.Id, g.RoundIndex, LogCommandDefinition.Start);
  104. //if (WeAppMsgClientManager.StartGroupNos.Contains(g.Id))
  105. //{
  106. // WeAppMsgClientManager.StartGroupNos.Remove(g.Id);
  107. //}
  108. }
  109. }
  110. else
  111. {
  112. group = await CheckGroup(groupNo, isStart: true);
  113. await WriteLog(group.CampNo, groupNo, group.RoundIndex, LogCommandDefinition.Start);
  114. groupNos.Add(groupNo);
  115. camp = group.CampInfo;
  116. if (group.CampGroupState == CampGroupStateDefinition.Run)
  117. {
  118. CheckErrors($"培训营[{group.Name}]已运行,不能操作!");
  119. }
  120. //if (WeAppMsgClientManager.StartGroupNos.Contains(groupNo))
  121. //{
  122. // WeAppMsgClientManager.StartGroupNos.Remove(groupNo);
  123. //}
  124. }
  125. if (camp == null)
  126. {
  127. CheckErrors($"未查询编号为【{campNo}】到培训营!");
  128. return;
  129. }
  130. if (camp.CampState == CampStateDefinition.New)
  131. {
  132. CheckErrors("培训营未审核,请先通过审核后再试!");
  133. }
  134. else if (camp.CampState == CampStateDefinition.End)
  135. {
  136. CheckErrors("培训营已结束,不能操作!");
  137. }
  138. WeAppMsgClientManager.StopPushScene(groupNo);
  139. RunStartPackageDto dto = new RunStartPackageDto()
  140. {
  141. PackageId = camp.PackageNo,
  142. AssessAuto = camp.AssessAuto,
  143. AssessRoles = camp.AssessRoleNames?.Split(',').ToList() ?? new List<string>(),
  144. AutoNextRound = false,
  145. RoundScore = camp.RoundScore,
  146. Variable = camp.Variable,
  147. GroupNos = groupNos,
  148. TargetClientId = MsgClientManager.ClientId
  149. };
  150. var url = $"{EngineApiUrl}api/services/Engine/Run/Start";
  151. var result = url.RequestPost(dto.Obj2String());
  152. if (result.Contains("\"success\":false"))
  153. {
  154. CheckErrors("培训营启动失败!");
  155. }
  156. if (group != null)
  157. await UpdateStep(new StepDto()
  158. {
  159. CampNo = campNo,
  160. StepId = "1_1"
  161. });
  162. }
  163. /// <summary>
  164. /// 停止培训营
  165. /// </summary>
  166. /// <param name="campNo"></param>
  167. /// <param name="groupNo"></param>
  168. /// <returns></returns>
  169. [AuditLog("停止培训营")]
  170. public async Task StopCamp(string campNo, string groupNo)
  171. {
  172. if (groupNo == "none")
  173. {
  174. var groups = await GroupRepository.GetAll().Where(a => a.CampNo == campNo && a.CampGroupState != CampGroupStateDefinition.End).OrderBy(a => a.Id).ToListAsync();
  175. foreach (var g in groups)
  176. {
  177. await WriteLog(g.CampNo, g.Id, g.RoundIndex, LogCommandDefinition.End);
  178. g.EngDate = g.EngDate ?? DateTime.Now;
  179. g.CampGroupState = CampGroupStateDefinition.End;
  180. await GroupRepository.UpdateAsync(g);
  181. ReloadPage(g.CampNo);
  182. }
  183. }
  184. else
  185. {
  186. var group = await CheckGroup(groupNo);
  187. if (group.CampGroupState != CampGroupStateDefinition.End)
  188. {
  189. group.EngDate = group.EngDate ?? DateTime.Now;
  190. group.CampGroupState = CampGroupStateDefinition.End;
  191. await GroupRepository.UpdateAsync(group);
  192. await WriteLog(group.CampNo, groupNo, group.RoundIndex, LogCommandDefinition.End);
  193. await UnitOfWorkManager.Current.SaveChangesAsync();
  194. ReloadPage(group.CampNo);
  195. }
  196. }
  197. }
  198. /// <summary>
  199. /// 结束培训营
  200. /// </summary>
  201. /// <param name="campNo"></param>
  202. /// <returns></returns>
  203. [AuditLog("结束培训营")]
  204. public async Task EndCamp(string campNo)
  205. {
  206. var camp = await CampRepository.FirstOrDefaultAsync(a => a.Id == campNo);
  207. if (camp != null && camp.CampState != CampStateDefinition.End)
  208. {
  209. camp.EngDate = camp.EngDate ?? DateTime.Now;
  210. camp.CampState = CampStateDefinition.End;
  211. await CampRepository.UpdateAsync(camp);
  212. }
  213. }
  214. /// <summary>
  215. /// 等待报告生成
  216. /// </summary>
  217. /// <param name="campNo"></param>
  218. /// <param name="groupNo"></param>
  219. /// <returns></returns>
  220. [AuditLog("等待报告生成")]
  221. public async Task WaitReport(string campNo, string groupNo)
  222. {
  223. var date = DateTime.Now;
  224. CampInfo camp;
  225. if (groupNo == "none")
  226. {
  227. camp = await CampRepository.FirstOrDefaultAsync(a => a.Id == campNo);
  228. if (camp.CampState == CampStateDefinition.End)
  229. {
  230. CheckErrors("演练已结束,不能操作");
  231. }
  232. var groups = await GroupRepository.GetAll().Where(a => a.CampNo == campNo).OrderBy(a => a.Id).ToListAsync();
  233. foreach (var g in groups)
  234. {
  235. await WriteLog(g.CampNo, g.Id, g.RoundIndex, LogCommandDefinition.End);
  236. g.CampGroupState = CampGroupStateDefinition.Report;
  237. g.EngDate = date;
  238. g.TrainingMinute = Convert.ToDateTime(g.StartDate).GetTimeSpanMinute(date);
  239. await GroupRepository.UpdateAsync(g);
  240. ReloadPage(g.CampNo);
  241. }
  242. }
  243. else
  244. {
  245. var group = await CheckGroup(groupNo);
  246. camp = group.CampInfo;
  247. if (camp.CampState == CampStateDefinition.End)
  248. {
  249. CheckErrors("演练已结束,不能操作");
  250. }
  251. group.CampGroupState = CampGroupStateDefinition.Report;
  252. group.EngDate = date;
  253. group.TrainingMinute = Convert.ToDateTime(group.StartDate).GetTimeSpanMinute(date);
  254. await GroupRepository.UpdateAsync(group);
  255. await WriteLog(group.CampNo, groupNo, group.RoundIndex, LogCommandDefinition.End);
  256. ReloadPage(group.CampNo);
  257. }
  258. camp.EngDate = date;
  259. await CampRepository.UpdateAsync(camp);
  260. }
  261. /// <summary>
  262. /// 重启培训营
  263. /// </summary>
  264. /// <param name="campNo"></param>
  265. /// <param name="groupNo"></param>
  266. /// <returns></returns>
  267. [AuditLog("重启培训营")]
  268. public async Task ReStartCamp(string campNo, string groupNo)
  269. {
  270. CampInfo camp;
  271. var groups = new List<CampGroupInfo>();
  272. if (groupNo == "none")
  273. {
  274. camp = await CampRepository.FirstOrDefaultAsync(a => a.Id == campNo);
  275. groups = await GroupRepository.GetAll().Where(a => a.CampNo == campNo).OrderBy(a => a.Id).ToListAsync();
  276. //groupNos = groups.Select(a => a.Id).ToList();
  277. foreach (var g in groups)
  278. {
  279. await WriteLog(g.CampNo, g.Id, g.RoundIndex, LogCommandDefinition.Start);
  280. }
  281. }
  282. else
  283. {
  284. var group = await CheckGroup(groupNo, isStart: true);
  285. await WriteLog(group.CampNo, groupNo, group.RoundIndex, LogCommandDefinition.Start);
  286. groups.Add(group);
  287. camp = group.CampInfo;
  288. }
  289. if (camp == null)
  290. {
  291. CheckErrors($"未查询编号为【{campNo}】到培训营!");
  292. return;
  293. }
  294. if (camp.CampState == CampStateDefinition.New)
  295. {
  296. CheckErrors("培训营未审核,请先通过审核后再试!");
  297. }
  298. else if (camp.CampState == CampStateDefinition.End)
  299. {
  300. CheckErrors("培训营已结束,不能操作!");
  301. }
  302. foreach (var g in groups)
  303. {
  304. //ReStartPackageDto dto = new ReStartPackageDto()
  305. //{
  306. // PackageId = camp.PackageNo,
  307. // AutoNextRound = false,
  308. // RunningInfo = g.RunningInfo,
  309. // TargetClientId = MsgClientManager.ClientId
  310. //};
  311. //var url = $"{EngineApiUrl}api/services/Engine/Run/ReStart";
  312. //var result = url.RequestPost(dto.Obj2String());
  313. //if (result.Contains("\"success\":false"))
  314. //{
  315. // CheckErrors("培训营启动失败!");
  316. //}
  317. ReStartGroup(g);
  318. Thread.Sleep(3000);
  319. }
  320. }
  321. /// <summary>
  322. /// 重启分组
  323. /// </summary>
  324. /// <param name="group"></param>
  325. /// <returns></returns>
  326. private bool ReStartGroup(CampGroupInfo group)
  327. {
  328. ReStartPackageDto dto = new ReStartPackageDto()
  329. {
  330. PackageId = group.CampInfo?.PackageNo,
  331. AutoNextRound = false,
  332. RunningInfo = group.RunningInfo,
  333. TargetClientId = MsgClientManager.ClientId
  334. };
  335. var url = $"{EngineApiUrl}api/services/Engine/Run/ReStart";
  336. var result = url.RequestPost(dto.Obj2String());
  337. if (result.Contains("\"success\":false"))
  338. {
  339. return false;
  340. }
  341. return true;
  342. }
  343. /// <summary>
  344. /// 下一轮次
  345. /// </summary>
  346. /// <param name="campNo"></param>
  347. /// <param name="groupNo"></param>
  348. /// <returns></returns>
  349. [AuditLog("下一轮次")]
  350. public async Task NextRound(string campNo, string groupNo)
  351. {
  352. string dataStr = "";
  353. string url = $"{EngineApiUrl}api/services/Engine/Run/NextRound";
  354. CampGroupInfo group = null;
  355. if (groupNo == "none")
  356. {
  357. var entity = await CampRepository.FirstOrDefaultAsync(a => a.Id == campNo);
  358. if (entity == null)
  359. {
  360. CheckErrors($"未查询编号为【{campNo}】到培训营!");
  361. return;
  362. }
  363. if (entity.CampState == CampStateDefinition.New)
  364. {
  365. CheckErrors("培训营未审核,请先通过审核后再试!");
  366. }
  367. if (entity.CampState == CampStateDefinition.End)
  368. {
  369. CheckErrors("培训营已结束!");
  370. }
  371. var groups = await GroupRepository.GetAll().Where(a => a.CampNo == campNo).OrderBy(a => a.Id).ToListAsync();
  372. //var groupNos = groups.Select(a => a.Id).ToList();
  373. //dataStr = new {GroupNos = groupNos}.Obj2String();
  374. foreach (var g in groups)
  375. {
  376. var postUrl = $"{url}?groupNo={g.Id}";
  377. Post(postUrl, dataStr, g);
  378. group = g;
  379. await WriteLog(g.CampNo, g.Id, g.RoundIndex, LogCommandDefinition.NextRound);
  380. Thread.Sleep(1000);
  381. }
  382. }
  383. else
  384. {
  385. group = await CheckGroup(groupNo);
  386. await WriteLog(campNo, groupNo, group.RoundIndex, LogCommandDefinition.NextRound);
  387. url = $"{url}?groupNo={groupNo}";
  388. Post(url, dataStr, group);
  389. }
  390. if (group != null)
  391. await UpdateStep(new StepDto()
  392. {
  393. CampNo = campNo,
  394. StepId = $"{group.RoundIndex + 1}_1"
  395. });
  396. }
  397. /// <summary>
  398. /// 操作培训营分组
  399. /// </summary>
  400. /// <param name="url"></param>
  401. /// <param name="dataStr"></param>
  402. /// <param name="group"></param>
  403. /// <param name="send"></param>
  404. private void Post(string url, string dataStr, CampGroupInfo group = null, bool send = true)
  405. {
  406. var result = url.RequestPost(dataStr);
  407. if (result.Contains("\"success\":false"))
  408. {
  409. if (!HasReStart && group != null && ReStartGroup(group))
  410. {
  411. HasReStart = true;
  412. Post(url, dataStr, group, send);
  413. }
  414. else
  415. {
  416. HasReStart = false;
  417. CheckErrors("培训营操作失败!");
  418. }
  419. }
  420. else if (send && group != null)
  421. {
  422. IwbHubContext.Clients.Group(group.CampNo).getDisabledScene(group.Id);
  423. }
  424. }
  425. /// <summary>
  426. /// 下一情景流节点
  427. /// </summary>
  428. /// <param name="campNo"></param>
  429. /// <param name="groupNo"></param>
  430. /// <returns></returns>
  431. [AbpAllowAnonymous, AuditLog("下一情景流节点")]
  432. public async Task NextFlowNode(string campNo, string groupNo)
  433. {
  434. string url = "", dataStr = "";
  435. url = $"{EngineApiUrl}api/services/Engine/Run/NextGroupFlowNodes{url}";
  436. if (groupNo == "none")
  437. {
  438. var entity = await CampRepository.FirstOrDefaultAsync(a => a.Id == campNo);
  439. if (entity == null)
  440. {
  441. CheckErrors($"未查询编号为【{campNo}】到培训营!");
  442. return;
  443. }
  444. if (entity.CampState == CampStateDefinition.New)
  445. {
  446. CheckErrors("培训营未审核,请先通过审核后再试!");
  447. }
  448. if (entity.CampState == CampStateDefinition.End)
  449. {
  450. CheckErrors("培训营已结束!");
  451. }
  452. var groups = await GroupRepository.GetAll().Where(a => a.CampNo == campNo).ToListAsync();
  453. //var groupNos = await GroupRepository.GetAll().Where(a => a.CampNo == campNo).Select(a => a.Id).ToListAsync();
  454. //var dto = new RunGroupPackageDto()
  455. //{
  456. // GroupNos = groupNos
  457. //};
  458. //dataStr = dto.Obj2String();
  459. foreach (var g in groups)
  460. {
  461. var postUrl = $"{url}?groupNo={g.Id}";
  462. Post(postUrl, dataStr, g);
  463. await WriteLog(g.CampNo, g.Id, g.RoundIndex, LogCommandDefinition.NextNode);
  464. await ChangeLogState(g.Id);
  465. Thread.Sleep(1000);
  466. await SyncSysScore(g);
  467. }
  468. //for (int i = 0; i < groupNos.Count; i++)
  469. //{
  470. // if (i == 0)
  471. // {
  472. // var group = await GroupRepository.FirstOrDefaultAsync(a => a.Id == groupNos[0]);
  473. // if (group != null)
  474. // {
  475. // }
  476. // }
  477. // await ChangeLogState(g.Id);
  478. //}
  479. }
  480. else
  481. {
  482. var group = await CheckGroup(groupNo);
  483. await ChangeLogState(group);
  484. await WriteLog(group.CampNo, groupNo, group.RoundIndex, LogCommandDefinition.NextNode);
  485. url = $"{url}?groupNo={groupNo}";
  486. Post(url, dataStr, group);
  487. await SyncSysScore(group);
  488. }
  489. //var result = url.RequestPost(dataStr);
  490. //if (result.Contains("\"success\":false"))
  491. //{
  492. // CheckErrors("培训营操作失败!");
  493. //}
  494. }
  495. /// <summary>
  496. /// 情景流下一阶段后延迟10秒主动同步系统得分
  497. /// </summary>
  498. /// <param name="group"></param>
  499. /// <returns></returns>
  500. private Task SyncSysScore(CampGroupInfo group)
  501. {
  502. Task task = Task.Factory.StartNew(async () =>
  503. {
  504. var gs = CacheManager.GetGroupRoundScore(group.Id, group.RoundIndex, GsRepository).Result;
  505. if (gs != null)
  506. {
  507. await Task.Delay(1000 * 10);
  508. var runningInfo = await CacheManager.GetGroupRunningInfo(group.Id, GroupRepository);
  509. gs.SystemScore = runningInfo.FullScore != 0 ? runningInfo.RoundScore * runningInfo.SystemScore / runningInfo.FullScore : 0;
  510. await GsRepository.UpdateAsync(gs);
  511. }
  512. });
  513. return task;
  514. }
  515. /// <summary>
  516. /// 更新当前演练阶段
  517. /// </summary>
  518. /// <param name="input"></param>
  519. /// <returns></returns>
  520. [AuditLog("更新当前演练阶段")]
  521. public async Task UpdateStep(StepDto input)
  522. {
  523. var step = StepList.GetStepInfo(input.StepId);
  524. if (step != null)
  525. {
  526. await WriteLog(input.CampNo, null, 0, LogCommandDefinition.Step, step.Obj2String());
  527. IwbHubContext.Clients.Group(input.CampNo).getUpdateStep(step);
  528. }
  529. }
  530. private async Task<CampGroupInfo> CheckGroup(string groupNo, CampGroupInfo group = null, bool isStart = false)
  531. {
  532. group = group ?? await GroupRepository.GetAllIncluding(a => a.CampInfo).FirstOrDefaultAsync(a => a.Id == groupNo);
  533. if (group == null)
  534. {
  535. CheckErrors($"未查询编号为【{groupNo}】到培训营!");
  536. return null;
  537. }
  538. if (group.CampGroupState == CampGroupStateDefinition.End)
  539. {
  540. CheckErrors("培训营已结束,不能操作!");
  541. }
  542. else if (group.CampGroupState != CampGroupStateDefinition.Run && !isStart)
  543. {
  544. CheckErrors("培训营未运行,不能操作!");
  545. }
  546. return group;
  547. }
  548. private async Task ChangeLogState(string no)
  549. {
  550. var group = await GroupRepository.FirstOrDefaultAsync(a => a.Id == no);
  551. if (group != null)
  552. {
  553. await ChangeLogState(group);
  554. }
  555. }
  556. private async Task ChangeLogState(CampGroupInfo group)
  557. {
  558. var logList = await GlRepository.GetAllListAsync(a =>
  559. a.GroupNo == group.Id && a.RoundIndex == group.RoundIndex &&
  560. a.LogType == LogTypeDefinition.SceneOperation &&
  561. (a.LogState == LogStateDefinition.New || a.LogState == LogStateDefinition.Submit || a.LogState == LogStateDefinition.HasMatch));
  562. if (logList.Any())
  563. {
  564. foreach (var log in logList)
  565. {
  566. log.LogState = log.LogState == LogStateDefinition.New ? LogStateDefinition.NotSend :
  567. log.LogState == LogStateDefinition.Submit ? LogStateDefinition.Send : log.LogState == LogStateDefinition.HasMatch ? LogStateDefinition.HasSendMatch : log.LogState;
  568. await GlRepository.UpdateAsync(log);
  569. }
  570. }
  571. }
  572. /// <summary>
  573. /// 提交情景处理
  574. /// </summary>
  575. /// <param name="input"></param>
  576. /// <returns></returns>
  577. [AbpAllowAnonymous, AuditLog("提交情景处理")]
  578. public async Task SaveOperationScene(RunOperationDto input)
  579. {
  580. var group = await GroupRepository.FirstOrDefaultAsync(a => a.Id == input.GroupNo);
  581. if (group == null)
  582. {
  583. CheckErrors($"未查询编号为【{input.GroupNo}】到培训营!");
  584. return;
  585. }
  586. var groupLog = new GroupLogInfo()
  587. {
  588. CampNo = group.CampNo,
  589. GroupNo = input.GroupNo,
  590. LogType = LogTypeDefinition.SceneOperation,
  591. LogCommand = LogCommandDefinition.SceneOperation,
  592. LogState = LogStateDefinition.New,
  593. LogScore = 0,
  594. RoleName = input.BehaviorRole,
  595. LogMessage = input.BehaviorWord,
  596. RoundIndex = group.RoundIndex
  597. };
  598. await GlRepository.InsertAsync(groupLog);
  599. await CurrentUnitOfWork.SaveChangesAsync();
  600. IwbHubContext.Clients.Group(group.CampNo).getOperationLog(new
  601. {
  602. id = groupLog.Id,
  603. no = group.Id,
  604. role = input.BehaviorRole,
  605. word = input.BehaviorWord,
  606. logState = LogStateDefinition.New
  607. }.Obj2String());
  608. }
  609. /// <summary>
  610. /// 处理情景
  611. /// </summary>
  612. /// <param name="id"></param>
  613. /// <returns></returns>
  614. [AbpAllowAnonymous, AuditLog("处理情景")]
  615. public async Task OperationScene(int id)
  616. {
  617. var log = await GlRepository.FirstOrDefaultAsync(a => a.Id == id);
  618. if (log == null)
  619. {
  620. CheckErrors("未查询到处理记录!");
  621. return;
  622. }
  623. var group = await GroupRepository.GetAllIncluding(a => a.CampInfo).FirstOrDefaultAsync(a => a.Id == log.GroupNo);
  624. if (group == null)
  625. {
  626. CheckErrors($"未查询编号为【{log.GroupNo}】到培训营!");
  627. return;
  628. }
  629. if (group.CampGroupState != CampGroupStateDefinition.Run)
  630. {
  631. CheckErrors("培训营未运行!");
  632. }
  633. var checkRole = (await SettingManager.GetSettingValueAsync(IwbSettingNames.EvalCheckRole)).UAndT() == "Y" && group.CampInfo.AssessRoleNames.IsNotEmpty();
  634. log.LogState = LogStateDefinition.Submit;
  635. await GlRepository.UpdateAsync(log);
  636. var dataStr = new
  637. {
  638. log.GroupNo,
  639. BehaviorRole = log.RoleName,
  640. BehaviorWord = $"{log.Id}|{log.LogMessage}",
  641. CheckRole = checkRole
  642. }.Obj2String();
  643. string url = $"{EngineApiUrl}api/services/Engine/Run/MatchWord";
  644. Post(url, dataStr, group, false);
  645. //var result = url.RequestPost(dataStr);
  646. //if (result.Contains("\"success\":false"))
  647. //{
  648. // CheckErrors("培训营操作失败!");
  649. //}
  650. IwbHubContext.Clients.Group(group.CampNo).getOperationLogSubmit(new { no = group.Id, logId = log.Id }.Obj2String());
  651. }
  652. /// <summary>
  653. /// 处理情景
  654. /// </summary>
  655. /// <param name="input"></param>
  656. /// <returns></returns>
  657. [AbpAllowAnonymous, AuditLog("处理电话提问")]
  658. public async Task OperationPhone(OpPhoneQuestionDto input)
  659. {
  660. var log = await GlRepository.FirstOrDefaultAsync(a => a.Id == input.Id);
  661. var questionAnswers = await AnswerRepository.GetAllIncluding(a => a.QuestionInfo)
  662. .Where(a => a.QuestionNo == log.ExtendInfo1).ToListAsync();
  663. var score = 0;
  664. foreach (var answer in questionAnswers)
  665. {
  666. var arr = answer.Keywords.Split(',');
  667. foreach (var k in arr)
  668. {
  669. if (input.HandleContent.Contains(k))
  670. {
  671. score += answer.Type == PhoneAnswerTypeDefinition.Right ? 10 : -10;
  672. break;
  673. }
  674. }
  675. }
  676. var gs = await GsRepository.FirstOrDefaultAsync(a =>
  677. a.GroupNo == log.GroupNo && a.RoundIndex == log.RoundIndex);
  678. if (gs == null)
  679. {
  680. gs = new GroupScoreInfo
  681. {
  682. GroupNo = log.GroupNo,
  683. CampNo = log.CampNo,
  684. RoundIndex = log.RoundIndex,
  685. PhoneScore = score
  686. };
  687. await GsRepository.InsertAsync(gs);
  688. }
  689. else
  690. {
  691. gs.PhoneScore += score;
  692. await GsRepository.UpdateAsync(gs);
  693. }
  694. IwbHubContext.Clients.Group(log.GroupNo).getRoundScore2(new { no = log.GroupNo, round = gs.RoundIndex, phoneScore = gs.PhoneScore }.Obj2String());
  695. log.ExtendInfo4 = input.HandleContent;
  696. await GlRepository.UpdateAsync(log);
  697. IwbHubContext.Clients.Group(log.GroupNo).getPhoneQuestionSubmit(new { no = log.GroupNo }.Obj2String());
  698. }
  699. /// <summary>
  700. /// 变更状态
  701. /// </summary>
  702. /// <param name="campNo"></param>
  703. /// <param name="groupNo"></param>
  704. /// <param name="groupState"></param>
  705. /// <returns></returns>
  706. [AuditLog("变更状态")]
  707. public async Task ChangeState(string campNo, string groupNo, int groupState)
  708. {
  709. if (groupState != CampGroupStateDefinition.Ready && groupState != CampGroupStateDefinition.HeadQuarterBuilding && groupState != CampGroupStateDefinition.HeadQuarterBuilded)
  710. {
  711. CheckErrors($"非法状态!");
  712. }
  713. string text = groupState == CampGroupStateDefinition.Ready ? "演练已就绪" :
  714. groupState == CampGroupStateDefinition.HeadQuarterBuilding ? "正在组建指挥部" :
  715. groupState == CampGroupStateDefinition.HeadQuarterBuilded ? "指挥部已组建" : "";
  716. if (groupNo == "none")
  717. {
  718. var groups = await GroupRepository.GetAllIncluding(a => a.CampInfo).Where(a => a.CampNo == campNo)
  719. .ToListAsync();
  720. foreach (var g in groups)
  721. {
  722. await ChangGroupState(g, groupState);
  723. await CurrentUnitOfWork.SaveChangesAsync();
  724. IwbHubContext.Clients.Group(campNo).getHeadquarter(new { no = g.Id, text }.Obj2String());
  725. }
  726. ReloadPage(campNo);
  727. }
  728. else
  729. {
  730. var group = await GroupRepository.GetAllIncluding(a => a.CampInfo).FirstOrDefaultAsync(a => a.Id == groupNo);
  731. if (group == null)
  732. {
  733. CheckErrors($"未查询编号为【{groupNo}】到培训营!");
  734. return;
  735. }
  736. campNo = group.CampNo;
  737. await ChangGroupState(group, groupState);
  738. await CurrentUnitOfWork.SaveChangesAsync();
  739. ReloadPage(groupNo);
  740. IwbHubContext.Clients.Group(group.CampNo).getHeadquarter(new { no = groupNo, text }.Obj2String());
  741. }
  742. if (groupState == CampGroupStateDefinition.Ready)
  743. {
  744. await UpdateStep(new StepDto()
  745. {
  746. CampNo = campNo,
  747. StepId = "0_1"
  748. });
  749. }
  750. else if (groupState == CampGroupStateDefinition.HeadQuarterBuilding)
  751. {
  752. await UpdateStep(new StepDto()
  753. {
  754. CampNo = campNo,
  755. StepId = "0_2"
  756. });
  757. }
  758. }
  759. /// <summary>
  760. /// 保存分组评分
  761. /// </summary>
  762. /// <param name="input"></param>
  763. /// <returns></returns>
  764. [AuditLog("保存分组评分")]
  765. public async Task SaveGroupScore(List<GroupScoreDto> input)
  766. {
  767. foreach (var gs in input)
  768. {
  769. var group = await GroupRepository.FirstOrDefaultAsync(a => a.Id == gs.GroupNo);
  770. if (group == null || group.CampGroupState == CampGroupStateDefinition.New)
  771. {
  772. CheckErrors($"分组【{gs.GroupNo}】不在运行状态,不能操作");
  773. }
  774. var entity = await GsRepository.FirstOrDefaultAsync(a => a.GroupNo == gs.GroupNo && a.RoundIndex == gs.RoundIndex);
  775. if (entity == null)
  776. {
  777. entity = ObjectMapper.Map<GroupScoreInfo>(gs);
  778. await GsRepository.InsertAsync(entity);
  779. }
  780. else
  781. {
  782. entity = ObjectMapper.Map(gs, entity);
  783. await GsRepository.UpdateAsync(entity);
  784. }
  785. await CurrentUnitOfWork.SaveChangesAsync();
  786. await CacheManager.GetCache(IwbCacheNames.GroupRunningInfoCache)
  787. .SetAsync($"SCORE-{gs.GroupNo}-{gs.RoundIndex}", entity);
  788. if (gs.IsSend)
  789. {
  790. string url = $"{EngineApiUrl}api/services/Engine/Run/CorrectScore?groupNo={entity.GroupNo}&score={entity.FinalTotalScore}";
  791. var result = url.RequestPost("");
  792. if (result.Contains("\"success\":false"))
  793. {
  794. CheckErrors("培训营评分发送失败!");
  795. }
  796. }
  797. }
  798. foreach (var gs in input)
  799. {
  800. if (gs.IsSend)
  801. {
  802. IwbHubContext.Clients.Group(gs.CampNo)
  803. .getSendScore(new { no = gs.GroupNo, systemScore = gs.FinalTotalScore }.Obj2String());
  804. }
  805. }
  806. }
  807. /// <summary>
  808. /// 保存分组角色
  809. /// </summary>
  810. /// <param name="input"></param>
  811. /// <returns></returns>
  812. [AbpAllowAnonymous, AuditLog("保存分组角色")]
  813. public async Task CreateGroupRole(RoleGroupDto input)
  814. {
  815. var entity = await GroupRepository.GetAllIncluding(a => a.CampInfo)
  816. .FirstOrDefaultAsync(a => a.Id == input.GroupNo);
  817. if (entity == null)
  818. {
  819. CheckErrors($"未查询到编号未【{input.GroupNo}】的培训营分组");
  820. return;
  821. }
  822. var list = new List<string>();
  823. string roleGroupNos = "", customRoles = "";
  824. if (input.SelfRoleNames != null && input.SelfRoleNames.Any())
  825. {
  826. list.AddRange(input.SelfRoleNames);
  827. customRoles = string.Join(",", input.SelfRoleNames.ToArray());
  828. }
  829. if (input.RoleGroupNos != null)
  830. {
  831. roleGroupNos = string.Join(",", input.RoleGroupNos.ToArray());
  832. foreach (var no in input.RoleGroupNos)
  833. {
  834. var roleNames = await GrrRepository.GetAllIncluding(a => a.TrainingRoleInfo)
  835. .Where(a => a.RoleGroupNo == no).Select(a => a.TrainingRoleInfo.RoleName).ToListAsync();
  836. if (roleNames.Any())
  837. {
  838. foreach (var name in roleNames)
  839. {
  840. if (!list.Contains(name)) list.Add(name);
  841. }
  842. }
  843. }
  844. }
  845. string names = string.Join(",", list.ToArray());
  846. var roleInfo = await GroupRoleRepository.FirstOrDefaultAsync(a => a.GroupNo == input.GroupNo);
  847. if (roleInfo == null)
  848. {
  849. roleInfo = new GroupRoleInfo
  850. {
  851. GroupNo = input.GroupNo,
  852. RoleNames = names,
  853. RoleGroupNos = roleGroupNos,
  854. CustomRoles = customRoles,
  855. };
  856. await GroupRoleRepository.InsertAsync(roleInfo);
  857. }
  858. else
  859. {
  860. roleInfo.RoleNames = names;
  861. roleInfo.RoleGroupNos = roleGroupNos;
  862. roleInfo.CustomRoles = customRoles;
  863. await GroupRoleRepository.UpdateAsync(roleInfo);
  864. }
  865. await CurrentUnitOfWork.SaveChangesAsync();
  866. entity.CampGroupState = CampGroupStateDefinition.HeadQuarterBuilded;
  867. await GroupRepository.UpdateAsync(entity);
  868. await CurrentUnitOfWork.SaveChangesAsync();
  869. await CacheManager.GetCache(IwbCacheNames.GroupInfoCache).RemoveAsync($"Plan-{input.GroupNo}");
  870. ReloadPage(entity.Id);
  871. IwbHubContext.Clients.Group(entity.Id).getGroupRole(new { no = entity.Id }.Obj2String());
  872. IwbHubContext.Clients.Group(entity.Id).getHeadquarter(new { no = entity.Id, text = "指挥部已组建" }.Obj2String());
  873. }
  874. /// <summary>
  875. /// 刷新前台页面
  876. /// </summary>
  877. /// <param name="no"></param>
  878. private void ReloadPage(string no)
  879. {
  880. IwbHubContext.Clients.Group(no).getReloadStu(new { no }.Obj2String());
  881. IwbHubContext.Clients.Group(no).getReloadLeader(new { no }.Obj2String());
  882. IwbHubContext.Clients.Group(no).getReloadPublic(new { no }.Obj2String());
  883. }
  884. /// <summary>
  885. /// 手动记录
  886. /// </summary>
  887. /// <param name="input"></param>
  888. /// <returns></returns>
  889. [AbpAllowAnonymous, AuditLog("手动记录")]
  890. public async Task ManualLog(LogDto input)
  891. {
  892. var group = await GroupRepository.FirstOrDefaultAsync(a => a.Id == input.No);
  893. if (group == null)
  894. {
  895. CheckErrors($"未查询编号为【{input.No}】到培训营!");
  896. return;
  897. }
  898. await WriteLog(group.CampNo, input.No, group.RoundIndex, LogCommandDefinition.Manual, input.Msg,
  899. logType: LogTypeDefinition.Manual);
  900. }
  901. /// <summary>
  902. /// 专家评语
  903. /// </summary>
  904. /// <param name="input"></param>
  905. /// <returns></returns>
  906. [AbpAllowAnonymous, AuditLog("专家评语")]
  907. public async Task ZhuanJiaLog(LogDto input)
  908. {
  909. var group = await GroupRepository.FirstOrDefaultAsync(a => a.Id == input.No);
  910. if (group == null)
  911. {
  912. CheckErrors($"未查询编号为【{input.No}】到培训营!");
  913. return;
  914. }
  915. await WriteLog(group.CampNo, input.No, group.RoundIndex, LogCommandDefinition.ZhuanJia, input.Msg,
  916. logType: LogTypeDefinition.ZhuanJia);
  917. }
  918. /// <summary>
  919. /// 专家点评
  920. /// </summary>
  921. /// <param name="input"></param>
  922. /// <returns></returns>
  923. [AbpAllowAnonymous, AuditLog("专家点评")]
  924. public async Task<int> SendLogReviews(ReviewsDto input)
  925. {
  926. //await WriteLog(group.CampNo, input.No, group.RoundIndex, LogCommandDefinition.ZhuanJiaEffect, input.Effect,
  927. // logType: LogTypeDefinition.ZhuanJia);
  928. var log = await GlRepository.FirstOrDefaultAsync(a => a.Id == input.Id);
  929. if (log == null)
  930. {
  931. CheckErrors("未查询到处理记录!");
  932. return 0;
  933. }
  934. var group = await GroupRepository.GetAllIncluding(a => a.CampInfo).FirstOrDefaultAsync(a => a.Id == log.GroupNo);
  935. if (group == null)
  936. {
  937. CheckErrors($"未查询编号为【{log.GroupNo}】到培训营!");
  938. return 0;
  939. }
  940. if (group.CampGroupState != CampGroupStateDefinition.Run)
  941. {
  942. CheckErrors("培训营未运行!");
  943. }
  944. int value;
  945. var reviews = new List<NameValue>();
  946. if (string.IsNullOrEmpty(log.ExtendInfo1))
  947. {
  948. reviews.Add(new NameValue(input.ReviewsType, "1"));
  949. value = 1;
  950. }
  951. else
  952. {
  953. reviews = log.ExtendInfo1.Str2Obj<List<NameValue>>();
  954. var review = reviews.FirstOrDefault(a => a.Name == input.ReviewsType);
  955. if (review != null)
  956. {
  957. int.TryParse(review.Value, out value);
  958. value++;
  959. review.Value = value + "";
  960. }
  961. else
  962. {
  963. value = 1;
  964. reviews.Add(new NameValue(input.ReviewsType, "1"));
  965. }
  966. }
  967. log.ExtendInfo1 = reviews.Obj2String();
  968. await GlRepository.UpdateAsync(log);
  969. IwbHubContext.Clients.Group(group.Id).getEffectCmd(new { no = group.Id, effect = input.ReviewsType });
  970. return value;
  971. }
  972. /// <summary>
  973. /// 更新日志
  974. /// </summary>
  975. /// <param name="input"></param>
  976. /// <returns></returns>
  977. [AbpAllowAnonymous, DisableAuditing]
  978. public async Task UpdateLog(UpdateLogDto input)
  979. {
  980. var log = await GlRepository.FirstOrDefaultAsync(a => a.Id == input.Id);
  981. if (log != null)
  982. {
  983. log.LogMessage = input.Text;
  984. await GlRepository.UpdateAsync(log);
  985. }
  986. }
  987. #endregion Operation
  988. #region Query
  989. /// <summary>
  990. /// 查询当前情景的处理日志
  991. /// </summary>
  992. /// <param name="no"></param>
  993. /// <returns></returns>
  994. [DisableAuditing]
  995. public async Task<List<GroupRoleLogDto>> GetCurrentSceneLog(string no)
  996. {
  997. var group = await GroupRepository.FirstOrDefaultAsync(a => a.Id == no);
  998. if (group == null)
  999. {
  1000. CheckErrors($"未查询编号为【{no}】到培训营!");
  1001. return null;
  1002. }
  1003. var query = GlRepository.GetAll().Where(a =>
  1004. a.GroupNo == no && a.LogType == LogTypeDefinition.SceneOperation &&
  1005. a.RoundIndex == group.RoundIndex &&
  1006. (a.LogState == LogStateDefinition.New || a.LogState == LogStateDefinition.Submit || a.LogState == LogStateDefinition.HasMatch))
  1007. .OrderByDescending(a => a.Id).Select(a => new GroupRoleLogDto()
  1008. {
  1009. Id = a.Id,
  1010. GroupNo = no,
  1011. Role = a.RoleName,
  1012. Word = a.LogMessage,
  1013. LogState = a.LogState
  1014. });
  1015. var dtoList = await query.ToListAsync();
  1016. return dtoList;
  1017. }
  1018. /// <summary>
  1019. /// 查询当前轮次的处理日志
  1020. /// </summary>
  1021. /// <param name="no"></param>
  1022. /// <returns></returns>
  1023. [DisableAuditing]
  1024. public async Task<List<GroupRoleLogDto>> GetRoundLog(string no)
  1025. {
  1026. var group = await GroupRepository.FirstOrDefaultAsync(a => a.Id == no);
  1027. if (group == null)
  1028. {
  1029. CheckErrors($"未查询编号为【{no}】到培训营!");
  1030. return null;
  1031. }
  1032. var query = GlRepository.GetAll().Where(a =>
  1033. a.GroupNo == no && a.LogType == LogTypeDefinition.SceneOperation &&
  1034. a.RoundIndex == group.RoundIndex)
  1035. .OrderByDescending(a => a.Id).Select(a => new GroupRoleLogDto()
  1036. {
  1037. Id = a.Id,
  1038. GroupNo = no,
  1039. Role = a.RoleName,
  1040. Word = a.LogMessage,
  1041. LogState = a.LogState
  1042. });
  1043. var dtoList = await query.ToListAsync();
  1044. return dtoList;
  1045. }
  1046. /// <summary>
  1047. /// 查询所有处理日志
  1048. /// </summary>
  1049. /// <param name="no"></param>
  1050. /// <returns></returns>
  1051. [DisableAuditing]
  1052. public async Task<List<GroupRoleLogDto>> GetAllLog(string no)
  1053. {
  1054. var group = await GroupRepository.FirstOrDefaultAsync(a => a.Id == no);
  1055. if (group == null)
  1056. {
  1057. CheckErrors($"未查询编号为【{no}】到培训营!");
  1058. return null;
  1059. }
  1060. var query = GlRepository.GetAll().Where(a => a.GroupNo == no && a.LogType == LogTypeDefinition.SceneOperation)
  1061. .OrderByDescending(a => a.Id).Select(a => new GroupRoleLogDto()
  1062. {
  1063. Id = a.Id,
  1064. GroupNo = no,
  1065. Role = a.RoleName,
  1066. Word = a.LogMessage,
  1067. LogState = a.LogState
  1068. });
  1069. var dtoList = await query.ToListAsync();
  1070. return dtoList;
  1071. }
  1072. /// <summary>
  1073. /// 查询所有处理日志
  1074. /// </summary>
  1075. /// <param name="no"></param>
  1076. /// <param name="roleName"></param>
  1077. /// <returns></returns>
  1078. [DisableAuditing]
  1079. public async Task<List<GroupRoleLogDto>> GetAllRoleLog(string no, string roleName)
  1080. {
  1081. var group = await GroupRepository.FirstOrDefaultAsync(a => a.Id == no);
  1082. if (group == null)
  1083. {
  1084. CheckErrors($"未查询编号为【{no}】到培训营!");
  1085. return null;
  1086. }
  1087. var query = GlRepository.GetAll().Where(a => a.GroupNo == no && a.LogType == LogTypeDefinition.SceneOperation && a.RoleName == roleName)
  1088. .OrderByDescending(a => a.Id).Select(a => new GroupRoleLogDto()
  1089. {
  1090. GroupNo = no,
  1091. Role = a.RoleName,
  1092. Word = a.LogMessage,
  1093. LogState = a.LogState
  1094. });
  1095. var dtoList = await query.ToListAsync();
  1096. return dtoList;
  1097. }
  1098. /// <summary>
  1099. /// 记录日志
  1100. /// </summary>
  1101. /// <param name="campNo"></param>
  1102. /// <param name="groupNo"></param>
  1103. /// <param name="round"></param>
  1104. /// <param name="cmd"></param>
  1105. /// <param name="logMsg"></param>
  1106. /// <param name="role"></param>
  1107. /// <param name="score"></param>
  1108. /// <param name="logType"></param>
  1109. /// <returns></returns>
  1110. private async Task WriteLog(string campNo, string groupNo, int round, string cmd, string logMsg = "", string role = "", decimal score = 0, int? logType = null)
  1111. {
  1112. logType = logType ?? LogTypeDefinition.System;
  1113. var groupLog = new GroupLogInfo()
  1114. {
  1115. CampNo = campNo,
  1116. GroupNo = groupNo,
  1117. RoundIndex = round,
  1118. LogCommand = cmd,
  1119. LogMessage = logMsg,
  1120. RoleName = role,
  1121. LogType = (int)logType,
  1122. LogScore = score
  1123. };
  1124. await GlRepository.InsertAsync(groupLog);
  1125. await CurrentUnitOfWork.SaveChangesAsync();
  1126. if (logType == LogTypeDefinition.System)
  1127. {
  1128. var group = await GroupRepository.FirstOrDefaultAsync(a => a.Id == groupNo);
  1129. IwbHubContext.Clients.Group(campNo).getSysLog(new
  1130. {
  1131. id = groupLog.Id,
  1132. name = group?.Name ?? "系统",
  1133. msg = cmd,
  1134. date = DateTime.Now
  1135. }.Obj2String());
  1136. }
  1137. }
  1138. /// <summary>
  1139. /// 变更分组状态
  1140. /// </summary>
  1141. /// <param name="group"></param>
  1142. /// <param name="groupState"></param>
  1143. /// <returns></returns>
  1144. private async Task ChangGroupState(CampGroupInfo group, int groupState)
  1145. {
  1146. var camp = group.CampInfo;
  1147. if (group.CampGroupState == CampGroupStateDefinition.Run)
  1148. {
  1149. CheckErrors("培训营已运行!");
  1150. }
  1151. if (camp == null)
  1152. {
  1153. CheckErrors($"未查询编号为【{group.CampNo}】到培训营!");
  1154. return;
  1155. }
  1156. if (camp.CampState == CampStateDefinition.New)
  1157. {
  1158. CheckErrors("培训营未审核,请先通过审核后再试!");
  1159. }
  1160. group.CampGroupState = groupState;
  1161. await GroupRepository.UpdateAsync(group);
  1162. }
  1163. /// <summary>
  1164. /// 获取培训营详情
  1165. /// </summary>
  1166. /// <param name="no"></param>
  1167. /// <returns></returns>
  1168. [DisableAuditing]
  1169. public async Task<CampDetailDto> GetCampDetail(string no)
  1170. {
  1171. var entity = await CampRepository.FirstOrDefaultAsync(a => a.Id == no);
  1172. if (entity == null)
  1173. {
  1174. CheckErrors($"未查询编号为【{no}】到培训营!");
  1175. return null;
  1176. }
  1177. if (entity.CampState == CampStateDefinition.New)
  1178. {
  1179. CheckErrors("培训营未审核,请先通过审核后再试!");
  1180. }
  1181. if (entity.CampState == CampStateDefinition.End)
  1182. {
  1183. CheckErrors("培训营已结束!");
  1184. }
  1185. var groupInfos = await GroupRepository.GetAllListAsync(a => a.CampNo == no);
  1186. var groups = new List<GroupDto>();
  1187. foreach (var group in groupInfos)
  1188. {
  1189. var groupDto = await MapGroupDto(group);
  1190. groups.Add(groupDto);
  1191. }
  1192. return new CampDetailDto()
  1193. {
  1194. Id = no,
  1195. Name = entity.Name,
  1196. PackageNo = entity.PackageNo,
  1197. PackageName = entity.PackageName,
  1198. CampState = entity.CampState,
  1199. ScoreRule = entity.ScoreRule,
  1200. RoundScore = entity.RoundScore,
  1201. EvalBehaviorTags = entity.EvalBehaviorTags,
  1202. Groups = groups
  1203. };
  1204. }
  1205. /// <summary>
  1206. /// 获取培训营分组详情
  1207. /// </summary>
  1208. /// <param name="no"></param>
  1209. /// <returns></returns>
  1210. [AbpAllowAnonymous, DisableAuditing]
  1211. public async Task<GroupDto> GetGroupDetail(string no)
  1212. {
  1213. var group = await GroupRepository.FirstOrDefaultAsync(a => a.Id == no);
  1214. if (group == null)
  1215. {
  1216. CheckErrors($"未查询编号为【{no}】到培训营!");
  1217. return null;
  1218. }
  1219. var dto = await MapGroupDto(group);
  1220. return dto;
  1221. }
  1222. /// <summary>
  1223. /// 映射分组详情
  1224. /// </summary>
  1225. /// <param name="group"></param>
  1226. /// <returns></returns>
  1227. private async Task<GroupDto> MapGroupDto(CampGroupInfo group)
  1228. {
  1229. var dto = new GroupDto()
  1230. {
  1231. Id = group.Id,
  1232. Name = group.Name,
  1233. CampNo = group.CampNo,
  1234. CampGroupState = group.CampGroupState,
  1235. StartDate = group.StartDate,
  1236. EngDate = group.EngDate,
  1237. TrainingMinute = group.TrainingMinute,
  1238. RunningInfo = await GetGroupRunningInfo(group.Id),
  1239. //GroupScore = (await GsRepository.GetAllListAsync(s => s.GroupNo == group.Id)).Select(ObjectMapper.Map<GroupScoreDto>).ToList()
  1240. };
  1241. var gsList = await GsRepository.GetAllListAsync(a => a.GroupNo == group.Id);
  1242. dto.GroupScore = new List<GroupScoreDto>();
  1243. foreach (var gs in gsList)
  1244. {
  1245. var groupScore = await CacheManager.GetGroupRoundScore(group.Id, gs.RoundIndex, GsRepository);
  1246. if (groupScore != null)
  1247. {
  1248. dto.GroupScore.Add(ObjectMapper.Map<GroupScoreDto>(groupScore));
  1249. }
  1250. }
  1251. return dto;
  1252. }
  1253. /// <summary>
  1254. /// 获取分组运行信息
  1255. /// </summary>
  1256. /// <param name="no"></param>
  1257. /// <returns></returns>
  1258. [DisableAuditing]
  1259. public async Task<PackageDataNode> GetGroupRunningInfo(string no)
  1260. {
  1261. var runGroupInfo = await CacheManager.GetGroupRunningInfo(no, GroupRepository);
  1262. return runGroupInfo;
  1263. }
  1264. #endregion Query
  1265. }
  1266. }