EvalAppService.cs 51 KB

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