using Abp.Application.Services.Dto; using Abp.Auditing; using Abp.Authorization; using Abp.Configuration; using Abp.Domain.Repositories; using Abp.Runtime.Caching; using IwbZero.AppServiceBase; using IwbZero.ToolCommon.LogHelpers; using IwbZero.ToolCommon.StringModel; using System; using System.Collections.Generic; using System.Data.Entity; using System.IO; using System.Linq; using System.Speech.Synthesis; using System.Threading; using System.Threading.Tasks; using System.Web.Mvc; using WeApp.Authorization.Users; using WeApp.BaseInfo; using WeApp.BaseSystem.Query.Dto; using WeApp.BaseSystem.Users.Dto; using WeApp.BasicInfo; using WeApp.BasicInfo.PhoneQuestion.Dto; using WeApp.BasicInfo.StudentTip.Dto; using WeApp.BasicInfo.TrainingRoleGroup.Dto; using WeApp.Configuration; using WeApp.Configuration.Cache; using WeApp.TrainingCamp; using WeApp.TrainingCamp.Dto; using WeApp.TrainingCampGroup.Dto; using WeApp.TrainingEval.Dto; using WeEngine.ModelInfo; using WeEngine.Packages; namespace WeApp.BaseSystem.Query { [AbpAllowAnonymous, DisableAuditing] public class QueryAppService : IwbAppServiceBase, IQueryAppService { #region 仓储 public QueryAppService( IRepository userRepository, IRepository campRepository, IRepository groupRepository, IRepository cgrRepository, IRepository grrRepository, IRepository groupRoleRepository, IRepository roleRepository, IRepository glRepository, IRepository sceneMapRepository, IRepository attachRepository, IRepository gsRepository, IRepository prRepository, IRepository answerRepository, IRepository stuTipRepository, IRepository campHelpRepository, IRepository questionRepository) { UserRepository = userRepository; CampRepository = campRepository; GroupRepository = groupRepository; CgrRepository = cgrRepository; GrrRepository = grrRepository; GroupRoleRepository = groupRoleRepository; RoleRepository = roleRepository; GlRepository = glRepository; SceneMapRepository = sceneMapRepository; AttachRepository = attachRepository; GsRepository = gsRepository; PrRepository = prRepository; AnswerRepository = answerRepository; StuTipRepository = stuTipRepository; CampHelpRepository = campHelpRepository; QuestionRepository = questionRepository; } private string DataCenterUrl => IwbSettingNames.GetWeDataCenterIp(SettingManager).Ew("/"); //private string EngineUrl => IwbSettingNames.GetWeEngineIp(SettingManager).Ew("/"); protected IRepository CampRepository { get; } protected IRepository GroupRepository { get; } protected IRepository CgrRepository { get; } protected IRepository GrrRepository { get; } protected IRepository GroupRoleRepository { get; } protected IRepository GsRepository { get; } protected IRepository GlRepository { get; } protected IRepository RoleRepository { get; } protected IRepository UserRepository { get; } protected IRepository PrRepository { get; } public IRepository QuestionRepository { get; } public IRepository AnswerRepository { get; } public IRepository StuTipRepository { get; } public IRepository CampHelpRepository { get; } protected IRepository SceneMapRepository { get; } protected IRepository AttachRepository { get; } #endregion 仓储 #region SELECT #region Camp && Group public async Task> GetCampStateSelectList() { var list = await StatesManager.GetSelectListAsync("Camp", "State"); return list; } public async Task GetCampStateSelectStr() { var str = await StatesManager.GetSelectListStrAsync("Camp", "State"); str = "" + str; return str; } public async Task GetCampStateSelectStr(params string[] states) { var str = await StatesManager.GetSelectListStrAsync("Camp", "State", a => states.Contains(a.CodeValue)); str = "" + str; return str; } public async Task> GetCampGroupStateSelectList() { var list = await StatesManager.GetSelectListAsync("CampGroup", "State"); return list; } public async Task GetCampGroupStateSelectStr() { var str = await StatesManager.GetSelectListStrAsync("CampGroup", "State"); return str; } /// /// 获取当前营的帮助信息[2.3版本已弃用] /// /// /// public async Task GetStuHelpContentSelectStrByCamp(string no) { var list = await CampHelpRepository.GetAllIncluding(a => a.HelpInfo).Where(a => a.CampNo == no).Select(a => new { a.HelpInfo.Id, a.HelpInfo.Name, a.HelpInfo.Content }).ToListAsync(); var str = "";//""; foreach (var l in list) { str += $""; } return str; } /// /// 获取当前情景角色的提示信息 /// /// /// /// /// public async Task GetStuTipsSelectStrByRoleScene(string campNo, string sceneNo, string roleName) { var list = await GetStuTipsByRoleScene(campNo, sceneNo, roleName); var str = ""; foreach (var l in list) { str += $""; } return str; } public async Task GetCampSelectStr(params int[] states) { var list = await CampRepository.GetAllListAsync(a => states.Contains(a.CampState)); var str = ""; foreach (var l in list) { str += $""; } return str; } public async Task GetCampGroupSelectStr(string no) { var list = await GroupRepository.GetAllListAsync(a => a.CampNo == no); var str = ""; foreach (var l in list) { str += $""; } return str; } public async Task GetGroupRoleSelectStr(string no) { var list = (await GroupRoleRepository.FirstOrDefaultAsync(a => a.GroupNo == no))?.RoleNames?.Split(',').ToList() ?? new List(); var str = ""; foreach (var l in list) { str += $""; } return str; } #endregion Camp && Group public async Task GetStuTipsSelectStr() { var list = await StuTipRepository.GetAllListAsync(); var str = ""; foreach (var l in list) { str += $""; } return str; } /// /// 获取问题 /// /// public async Task GetQuestionsSelectStr() { var list = await QuestionRepository.GetAllListAsync(); var str = ""; foreach (var l in list) { str += $""; } return str; } /// /// PhoneQuestion类型 /// /// public async Task GetQuestionTypeSelectStr() { var str = await StatesManager.GetSelectListStrAsync("PhoneQuestion", "Type"); str = "" + str; return str; } /// /// PhoneQuestion类型 /// /// public async Task GetAnswerTypeSelectStr() { var str = await StatesManager.GetSelectListStrAsync("PhoneAnswer", "Type"); str = "" + str; return str; } /// /// 画像预置信息类型 /// /// public async Task GetPortraitRemarkTypeSelectStr() { var str = await StatesManager.GetSelectListStrAsync("PortraitRemark", "Type"); str = "" + str; return str; } #region 用户 [DisableAuditing] public async Task> GetUserSelectList() { var list = await UserRepository.GetAllListAsync(); var sList = new List { new SelectListItem { Text = @"请选择用户...", Value = "", Selected = true } }; foreach (var l in list) { sList.Add(new SelectListItem { Value = l.Id + "", Text = l.Name }); } return sList; } [DisableAuditing] public async Task GetUserSelectStr() { var list = await UserRepository.GetAllListAsync(); var str = ""; foreach (var l in list) { str += $""; } return str; } //[DisableAuditing] //public async Task GetCategorySelectStr() //{ // var list = await CategoryRepository.GetAllListAsync(); // string str = "";//""; // var tempParentNo = list.FirstOrDefault(a => a.ParentNo == null)?.Id ?? ""; // foreach (var l in list) // { // var name = l.CategoryName; // var parentNo = l.ParentNo; // var id = l.Id; // if (l.ParentNo == null) // { // parentNo = "0"; // id = ""; // name = "请选择类别"; // } // else if (l.ParentNo == tempParentNo) // { // parentNo = ""; // } // str += $""; // } // return str; //} #endregion 用户 #endregion SELECT /// /// 查询用户信息 /// /// /// [DisableAuditing] public async Task> QueryUsers(IwbPagedRequestDto input) { var query = UserRepository.GetAll().Where(a => a.IsActive); query = ApplyFilter(query, input); var totalCount = await query.CountAsync(); query = query.OrderBy(a => a.Id); query = query.Skip(input.SkipCount).Take(input.MaxResultCount); var entities = await query.ToListAsync(); var dtoList = new PagedResultDto(totalCount, ObjectMapper.Map>(entities)); return dtoList; } /// /// 查询培训营的分组 /// /// /// [DisableAuditing] public async Task> GetCampGroups(string no) { var query = await GroupRepository.GetAllListAsync(a => a.CampNo == no); var list = query.Select(ObjectMapper.Map).ToList(); return list; } /// /// 获取培训的角色组预案 /// /// /// public async Task> GetCampRoleGroupInfos(string no) { var roleGroups = await CgrRepository.GetAllIncluding(a => a.TrainingRoleGroupInfo).Where(a => a.CampNo == no).Select(a => a.TrainingRoleGroupInfo).ToListAsync(); var dtoList = new List(); foreach (var roleGroup in roleGroups) { var dto = ObjectMapper.Map(roleGroup); var roles = GrrRepository.GetAllIncluding(a => a.TrainingRoleInfo).Where(a => a.RoleGroupNo == dto.Id); dto.RoleNos = roles.Select(a => a.TrainRoleNo).ToList(); dto.RoleNames = string.Join(",", roles.Select(a => a.TrainingRoleInfo.RoleName).ToArray()); dtoList.Add(dto); } return dtoList; } /// /// 获取当前情景角色的提示信息 /// /// /// /// /// public async Task> GetStuTipsByRoleScene(string campNo, string sceneNo, string roleName) { return await CacheManager.GetCache(IwbCacheNames.CampInfoCache).GetAsync( $"STU-TIP_{campNo}_{sceneNo}_{roleName}", async () => { var sceneMap = await SceneMapRepository.FirstOrDefaultAsync(a => a.SceneNo == sceneNo && a.CampNo == campNo); var list = new List(); if (sceneMap != null) { list = await StuTipRepository.GetAll() .Where(a => sceneMap.TipNos.Contains(a.Id) && a.RoleName == roleName).Select(a => new StudentTipDto() { Content = a.Content, Id = a.Id, Name = a.Name, RoleName = a.RoleName }) .ToListAsync(); } return list; }); } /// /// 获取问题 /// /// public async Task> GetQuestions() { var list = await QuestionRepository.GetAllListAsync(); return list.Select(ObjectMapper.Map).ToList(); } /// /// 获取问题 /// /// public async Task GetQuestion(string no) { var entity = await QuestionRepository.FirstOrDefaultAsync(a => a.Id == no); return ObjectMapper.Map(entity); } /// /// 获取日志的电话问题 /// /// public async Task GetQuestionByLog(int no) { var log = await GlRepository.FirstOrDefaultAsync(a => a.Id == no); var entity = await QuestionRepository.FirstOrDefaultAsync(a => a.Id == log.ExtendInfo1); return ObjectMapper.Map(entity); } /// /// 获取带电话问题的日志 /// /// public async Task> GetQuestionLogs(string no) { var logs = await GlRepository.GetAll().Where(a => a.GroupNo == no && a.LogCommand == LogCommandDefinition.PhoneQuestion && string.IsNullOrEmpty(a.ExtendInfo4)).Select(a => a.Id).ToListAsync(); return logs; } /// /// 获取问题的答案 /// /// /// public async Task> GetQuestionAnswers(string no) { var list = await AnswerRepository.GetAllListAsync(a => a.QuestionNo == no); return list.Select(ObjectMapper.Map).ToList(); } /// /// 获取培训营学员提示 /// /// /// public async Task> GetStuHelpStrByCamp(string no) { var list = await CampHelpRepository.GetAllIncluding(a => a.HelpInfo).Where(a => a.CampNo == no).Select(a => a.HelpInfo.Id).ToListAsync(); return list; } /// /// 预加载 /// /// [DisableAuditing] public async Task LoadCampPre(string no, int type) { var camp = await GroupRepository.GetAllIncluding(a => a.CampInfo).Where(a => a.Id == no).Select(a => new CampDto { PackageNo = a.CampInfo.PackageNo }).FirstOrDefaultAsync(); if (camp != null) { await Task.Run(() => { CacheManager.GetPackageDetail(camp.PackageNo, DataCenterUrl); }); if (type != 0) { await Task.Run(() => { CacheManager.GetPackageDataNode(camp.PackageNo, DataCenterUrl); }); } } } /// /// 查询培训营分组的演练角色 /// /// /// public async Task> GetGroupRoleInfos(string no) { var entity = await GroupRoleRepository.FirstOrDefaultAsync(a => a.GroupNo == no); var list = entity?.RoleNames?.Split(',').ToList() ?? new List(); return list; } /// /// 查询培训营分组的演练角色预案 /// /// /// public async Task GetGroupRolePlans(string no) { return await CacheManager.GetCache(IwbCacheNames.GroupInfoCache).GetAsync($"Plan-{no}", async () => { var entity = await GroupRoleRepository.FirstOrDefaultAsync(a => a.GroupNo == no); if (entity == null) { return null; } var plans = new List(); if (entity.RoleGroupNos != null) { var nos = entity.RoleGroupNos.Split(','); foreach (var n in nos) { var gr = await GrrRepository.GetAllIncluding(a => a.TrainingRoleInfo, a => a.RoleGroupInfo) .Where(a => a.RoleGroupNo == n).ToListAsync(); if (gr.Any()) { var name = gr[0].RoleGroupInfo.RoleGroupName; var roles = gr.Select(a => a.TrainingRoleInfo.RoleName).ToList(); plans.Add(new RolePlanDto() { Name = name, RoleName = roles }); } } } if (entity.CustomRoles.IsNotEmpty()) { plans.Add(new RolePlanDto() { Name = "自定义角色", RoleName = entity.CustomRoles.Split(',').ToList() }); } return new GroupRolePlanDto() { GroupNo = no, Plans = plans }; }); } /// /// 查询培训营情景路径 /// /// /// public async Task> GetCampRunningInfos(string no) { var groupNos = await GroupRepository.GetAll().Where(a => a.CampNo == no).Select(a => a.Id).ToListAsync(); var list = new List(); if (groupNos.Any()) { foreach (var groupNo in groupNos) { var runGroupInfo = await CacheManager.GetGroupRunningInfo(groupNo, GroupRepository); if (runGroupInfo != null) { list.Add(runGroupInfo); } } } return list; } /// /// 获取某组的情景路径 /// /// /// public async Task GetGroupRunningInfo(string no) { var runGroupInfo = await CacheManager.GetGroupRunningInfo(no, GroupRepository); return runGroupInfo; } //private RunningInfo GetRunningInfo(string no) //{ // var url = // $"{EngineUrl}api/services/Engine/Run/QueryRunningInfo?runningId={no}"; // var result = url.RequestPost(""); // var info = result.Str2Obj(); // return info; //} #region 日志 /// /// 查询当前情景的处理日志 /// /// /// [DisableAuditing] public async Task> GetCurrentSceneLog(string no) { var group = await GroupRepository.FirstOrDefaultAsync(a => a.Id == no); if (group == null) { CheckErrors($"未查询编号为【{no}】到培训营!"); return null; } var query = GlRepository.GetAll().Where(a => a.GroupNo == no && a.LogType == LogTypeDefinition.SceneOperation && a.RoundIndex == group.RoundIndex && (a.LogState == LogStateDefinition.New || a.LogState == LogStateDefinition.Submit || a.LogState == LogStateDefinition.HasMatch)) .OrderByDescending(a => a.Id).Select(a => new GroupRoleLogDto() { Id = a.Id, GroupNo = no, Role = a.RoleName, Word = a.LogMessage, LogState = a.LogState, ScenePath = a.ScenePath, ExtendInfo1 = a.ExtendInfo1, ExtendInfo2 = a.ExtendInfo2, ExtendInfo3 = a.ExtendInfo3, ExtendInfo4 = a.ExtendInfo4, }); var dtoList = await query.ToListAsync(); return dtoList; } /// /// 查询培训营分组的处理日志 /// /// /// public async Task> GetGroupLogs(string no) { var group = await GroupRepository.FirstOrDefaultAsync(a => a.Id == no); if (group == null) { CheckErrors($"未查询编号为【{no}】到培训营!"); return null; } var query = GlRepository.GetAll().Where(a => a.GroupNo == no && a.LogType == LogTypeDefinition.SceneOperation) .OrderByDescending(a => a.Id).Select(a => new GroupRoleLogDto() { Id = a.Id, GroupNo = no, Role = a.RoleName, Word = a.LogMessage, LogState = a.LogState, ExtendInfo1 = a.ExtendInfo1, ExtendInfo2 = a.ExtendInfo2, ExtendInfo3 = a.ExtendInfo3, ExtendInfo4 = a.ExtendInfo4, }); var dtoList = await query.ToListAsync(); return dtoList; } /// /// 获取系统日志 /// /// /// public async Task> GetCampLogs(string no) { var dtoList = await GlRepository.GetAllIncluding(a => a.CampGroupInfo).Where(a => a.CampNo == no && a.LogType == LogTypeDefinition.System) .OrderBy(a => a.Id).Select(a => new QueryLogDto() { Name = a.CampGroupInfo != null ? a.CampGroupInfo.Name : "系统", Msg = a.LogCommand, Date = a.CreationTime }).ToListAsync(); return dtoList; } /// /// 获取专家的问题 /// /// /// public async Task GetQuestionById(int id) { var log = await GlRepository.FirstOrDefaultAsync(a => a.Id == id); return log.LogMessage ?? ""; } /// /// 获取专家的问题 /// /// /// /// public async Task> GetQuestionsByGroup(string groupNo, string campNo) { var list = await GlRepository.GetAll().Where(a => a.CampNo == campNo && (a.GroupNo == null || a.GroupNo == groupNo) && a.LogCommand == LogCommandDefinition.SpecialistQuestion).Select(a => new OpSpecialistQuestionDto { Id = a.Id, Question = a.LogMessage, }).ToListAsync(); var logs = new List(); foreach (var item in list) { var answers = await GlRepository.GetAll().Where(a => a.ParentNo == item.Id + "" && a.GroupNo == groupNo).Select(a => new OpSpecialistAnswerDto() { Id = a.Id, Answer = a.LogMessage, GroupNo = a.GroupNo, GroupName = a.ExtendInfo1, }).ToListAsync(); item.Answers = answers; logs.Add(item); } return logs.OrderByDescending(a => a.Id).ToList(); ; } /// /// 获取专家问答信息 /// /// /// public async Task> GetQuestionAndAnswerByCamp(string campNo) { var list = await GlRepository.GetAllIncluding(a => a.CampGroupInfo).Where(a => a.CampNo == campNo && a.LogCommand == LogCommandDefinition.SpecialistQuestion).Select(a => new OpSpecialistQuestionDto { Id = a.Id, GroupName = a.GroupNo == null ? "全部分组" : a.CampGroupInfo.Name, Question = a.LogMessage, }).ToListAsync(); foreach (var item in list) { var answers = await GlRepository.GetAll().Where(a => a.ParentNo == item.Id + "").Select(a => new OpSpecialistAnswerDto() { Id = a.Id, GroupNo = a.GroupNo, GroupName = a.ExtendInfo1, Answer = a.LogMessage, }).ToListAsync(); item.Answers = answers; } return list.OrderByDescending(a => a.Id).ToList(); } #endregion 日志 #region 情景 /// /// 获取分组当前运行中的情景 /// /// /// public async Task> GetGroupRunningScenes(string no) { var group = await GroupRepository.FirstOrDefaultAsync(a => a.Id == no); if (group == null) { CheckErrors($"未查询编号为【{no}】到培训营!"); return null; } List list = new List(); var runGroupInfo = await CacheManager.GetGroupRunningInfo(no, GroupRepository); if (runGroupInfo == null) { return list; } var runRound = runGroupInfo.Children?.FirstOrDefault(a => a.IsStart && !a.IsEnd); if (runRound != null) { var runBlocks = runRound.Children?.Where(a => a.IsStart && !a.IsEnd).OrderBy(a => a.Id); if (runBlocks != null) { foreach (var b in runBlocks) { var runFlows = b.Children?.Where(a => a.IsStart && !a.IsEnd).OrderBy(a => a.Id); if (runFlows != null) foreach (var f in runFlows) { var runNodes = f.Children?.Where(a => a.IsStart).OrderBy(a => a.Id); if (runNodes != null) foreach (var node in runNodes) { list = await GetSceneFromNode(list, node, no, true); } } } } } return list; } /// /// 获取分组情景 /// /// /// public async Task> GetGroupScenes(string no) { var group = await GroupRepository.FirstOrDefaultAsync(a => a.Id == no); if (group == null) { CheckErrors($"未查询编号为【{no}】到培训营!"); return null; } List list = new List(); //var pathDto = (ScenePathDto)(await CacheManager.GetCache(IwbCacheNames.SceneInfoCache) // .GetOrDefaultAsync($"SceneNos-{no}")); //if (pathDto != null) //{ // list = (List)await CacheManager.GetCache(IwbCacheNames.SceneInfoCache).GetOrDefaultAsync($"SceneInfos-{no}"); // if (pathDto.hasChange || list == null || list.Count == 0) // { // pathDto.hasChange = false; // await CacheManager.GetCache(IwbCacheNames.SceneInfoCache).SetAsync($"SceneNos-{no}", pathDto); // list = new List(); // foreach (var path in pathDto.PathList) // { // var scene = await GetSceneInfo_Last(no, path); // if (scene != null) // { // list.Add(scene); // } // } // await CacheManager.GetCache(IwbCacheNames.SceneInfoCache).SetAsync($"SceneInfos-{no}", list); // } //} //else //{ //} var runGroupInfo = await CacheManager.GetGroupRunningInfo(no, GroupRepository); if (runGroupInfo == null) { return list; } var runRounds = runGroupInfo.Children?.Where(a => a.IsStart).OrderBy(a => a.Id); if (runRounds != null) foreach (var r in runRounds) { var runBlocks = r.Children?.Where(a => a.IsStart).OrderBy(a => a.Id); if (runBlocks != null) foreach (var b in runBlocks) { var runFlows = b.Children?.Where(a => a.IsStart).OrderBy(a => a.Id); if (runFlows != null) foreach (var f in runFlows) { var runNodes = f.Children?.Where(a => a.IsStart).OrderBy(a => a.Id); if (runNodes != null) foreach (var node in runNodes) { list = await GetSceneFromNode(list, node, no); } } } } //if (list.Any()) //{ // pathDto = new ScenePathDto() // { // hasChange = false, // PathList = list.Select(a => a.Path).ToList() // }; // await CacheManager.GetCache(IwbCacheNames.SceneInfoCache).SetAsync($"SceneNos-{no}", pathDto); //} if (list.Any()) { list = list.OrderByDescending(a => a.HasEnd).ToList(); } return list; } /// /// 提取情景节点中的情景信息 /// /// /// /// /// /// private async Task> GetSceneFromNode(List list, FlowNodeDataNode node, string groupNo, bool isRunningScene = false) { if (node.SceneNodes != null) { if (!isRunningScene || !node.IsEnd) { foreach (var scene in node.SceneNodes) { var dto = await GetGroupSceneInfo(groupNo, scene.Path); if (dto != null) { dto.HasEnd = scene.IsEnd; list.Add(dto); } } } } var child = node.Children?.FirstOrDefault(a => a.IsStart); if (child != null) { list = await GetSceneFromNode(list, child, groupNo, isRunningScene); } return list; } private async Task GetSceneInfo_Last(string no, string scenePath) { var dto = CacheManager.GetCache(IwbCacheNames.SceneInfoCache) .Get($"{no}-{scenePath}-end", () => default(SceneDto)); if (dto == null) { await CacheManager.GetCache(IwbCacheNames.SceneInfoCache).RemoveAsync($"{no}-{scenePath}"); dto = await GetGroupSceneInfo(no, scenePath); } return dto; } /// /// 查询情景信息 /// /// /// /// [DisableAuditing] public async Task GetGroupSceneInfo(string no, string scenePath) { //Stopwatch stopwatch = new Stopwatch(); //Stopwatch stopwatch2 = new Stopwatch(); //stopwatch.Start(); //stopwatch2.Start(); var groupCampNo = await GroupRepository.GetAll().Where(a => a.Id == no).Select(a => a.CampNo).FirstOrDefaultAsync(); if (groupCampNo == null) { CheckErrors($"未查询编号为【{no}】到培训营!"); return null; } var sceneDto = await CacheManager.GetCache(IwbCacheNames.SceneInfoCache).GetAsync($"{no}-{scenePath}", async () => { SceneDto dto = null; try { var detail = await CacheManager.GetCampPackageDetail(groupCampNo, DataCenterUrl, CampRepository); var scene = detail?.Scenes.FirstOrDefault(a => a.Path == scenePath); if (scene == null) { return null; } dto = scene.Obj2String().Str2Obj(); //var runGroupInfo = await CacheManager.GetGroupRunningInfo(no, GroupRepository); //if (runGroupInfo == null) //{ // return null; //} //var runScene = runGroupInfo.RunSceneInfos.FirstOrDefault(a => a.Path == scene.Path); //stopwatch.Stop(); //this.LogInfo($"1耗时{scenePath}:{stopwatch.ElapsedMilliseconds}毫秒"); //stopwatch.Restart(); var runScene = await GetRunScene(no, scene); if (runScene != null) { dto.HasEnd = runScene.IsEnd; dto.Variables = dto.Variables.MergeHashtable(runScene.GetVariables()); } //stopwatch.Stop(); //this.LogInfo($"2耗时{scenePath}:{stopwatch.ElapsedMilliseconds}毫秒"); //stopwatch.Restart(); var gList = new List(); if (scene.GuideNos.IsNotEmpty()) { var arr = scene.GuideNos.Split(','); foreach (var gNo in arr) { var g = detail.Guides?.FirstOrDefault(a => a.Id == gNo); if (g != null) { gList.Add(g); } } } dto.GuideInfos = gList; var attachList = await CacheManager.GetSceneAttaches(groupCampNo, scene.Id, SceneMapRepository, AttachRepository); dto.Attaches = attachList; } catch (Exception e) { this.LogError(e); } //stopwatch2.Stop(); //this.LogInfo($"【总耗时】:{stopwatch2.ElapsedMilliseconds}毫秒"); return dto; }); if (sceneDto != null && sceneDto.HasEnd) { await CacheManager.GetCache(IwbCacheNames.SceneInfoCache).SetAsync($"{no}-{scenePath}-end", sceneDto); } return sceneDto; } private async Task GetRunScene(string no, SceneModel scene) { SceneDataNode runScene = null; var i = 0; while (runScene == null && i < 5) { var runGroupInfo = await CacheManager.GetGroupRunningInfo(no, GroupRepository); runScene = runGroupInfo?.RunSceneInfos.FirstOrDefault(a => a.Path == scene.Path); i++; //if (runScene == null) //{ // await CacheManager.GetCache(IwbCacheNames.GroupRunningInfoCache).RemoveAsync(no); // Thread.Sleep(500 * i); //} int time = 400 - i * 50; time = time > 0 ? time : 50; Thread.Sleep(time); } return runScene; } #endregion 情景 /// /// 查询分组当前轮次得分 /// /// /// [DisableAuditing] public async Task GetGroupScoreInfo(string no) { var group = await GroupRepository.FirstOrDefaultAsync(a => a.Id == no); if (group == null) { CheckErrors($"未查询编号为【{no}】到培训营!"); return null; } var score = await GsRepository.GetAll().Where(a => a.GroupNo == no).OrderByDescending(a => a.RoundIndex) .FirstOrDefaultAsync(); if (score == null) { return null; } var dto = ObjectMapper.Map(score); return dto; } /// /// 查询培训营得分 /// /// /// public async Task> GetScoreInfo(string no) { var scores = await GsRepository.GetAllIncluding(a => a.CampGroupInfo, a => a.CampGroupInfo.CampInfo) .Where(a => a.CampNo == no).OrderBy(a => a.GroupNo).ThenBy(a => a.RoundIndex).Select(a => new QueryGroupScoreDto() { GroupNo = a.GroupNo, GroupName = a.CampGroupInfo.Name, CampNo = a.CampNo, RoundIndex = a.RoundIndex, SystemScore = a.FinalTotalScore != 0 ? a.FinalTotalScore : a.SystemScore, TotalScore = a.CampGroupInfo.CampInfo.RoundScore, BehaviorTagScoreInfo = a.BehaviorTagScoreInfo }).ToListAsync(); return scores; } /// /// 查询培训营得分 /// /// /// public async Task> GetScoreChart(string no) { var scores = await GsRepository.GetAllIncluding(a => a.CampGroupInfo, a => a.CampGroupInfo.CampInfo) .Where(a => a.CampNo == no).OrderBy(a => a.GroupNo).ThenBy(a => a.RoundIndex).Select(a => new QueryGroupScoreDto() { GroupNo = a.GroupNo, GroupName = a.CampGroupInfo.Name, CampNo = a.CampNo, RoundIndex = a.RoundIndex, SystemScore = a.FinalTotalScore > 0 ? a.FinalTotalScore : a.CorrectionScore > 0 ? a.CorrectionScore : a.SystemScore, TotalScore = a.CampGroupInfo.CampInfo.RoundScore, BehaviorTagScoreInfo = a.BehaviorTagScoreInfo }).ToListAsync(); var groups = await GroupRepository.GetAllIncluding(a => a.CampInfo).Where(a => a.CampNo == no).ToListAsync(); var score = 0;//scores.Any(a => a.SystemScore > 0) ? 0 : 50; var btsInfo = "[{\"tagNo\":\"对媒体\",\"systemScore\":0,\"totalScore\":10}," + "{\"tagNo\":\"对上级\",\"systemScore\":0,\"totalScore\":10}," + "{\"tagNo\":\"对下级\",\"systemScore\":0,\"totalScore\":10}," + "{\"tagNo\":\"对相关单位\",\"systemScore\":0,\"totalScore\":10}," + "{\"tagNo\":\"决策力\",\"systemScore\":8,\"totalScore\":10}," + "{\"tagNo\":\"协调力\",\"systemScore\":8,\"totalScore\":10}," + "{\"tagNo\":\"研判力\",\"systemScore\":8,\"totalScore\":10}," + "{\"tagNo\":\"舆论引导力\",\"systemScore\":8,\"totalScore\":10}," + "{\"tagNo\":\"掌控力\",\"systemScore\":8,\"totalScore\":10}]"; foreach (var group in groups) { for (int i = 1; i <= 3; i++) { //if (!scores.Any(a => a.GroupNo == group.Id && a.RoundIndex == group.RoundIndex)) var scoreDto = scores.FirstOrDefault(a => a.GroupNo == group.Id && a.RoundIndex == i); if (scoreDto == null) { scores.Add(new QueryGroupScoreDto() { GroupNo = group.Id, GroupName = group.Name, CampNo = group.CampNo, RoundIndex = i, SystemScore = score, TotalScore = group.CampInfo.RoundScore, BehaviorTagScoreInfo = btsInfo }); } else { if (scoreDto.BehaviorTagScoreInfo.IsEmpty()) { scoreDto.BehaviorTagScoreInfo = btsInfo; } } } } return scores.OrderBy(a => a.GroupNo).ToList(); } /// /// 查询培训营处理日志统计 /// /// /// public async Task> GetCampLogChart(string no) { var list = await GlRepository.GetAllIncluding(a => a.CampGroupInfo) .Where(a => a.CampNo == no && a.LogType == LogTypeDefinition.SceneOperation).Select(a => new GroupRoleLogDto { GroupNo = a.GroupNo, GroupName = a.CampGroupInfo.Name, LogState = a.LogState, }).ToListAsync(); var dtoList = list.GroupBy(a => a.GroupNo).Select(a => new ChartLogDto() { GroupNo = a.Key, GroupName = a.FirstOrDefault()?.GroupName, Matched = a.Count(s => s.LogState == LogStateDefinition.HasMatch || s.LogState == LogStateDefinition.HasSendMatch), NotMatched = a.Count(s => s.LogState == LogStateDefinition.Send || s.LogState == LogStateDefinition.Submit) }).ToList(); var groups = await GroupRepository.GetAllListAsync((a => a.CampNo == no)); foreach (var group in groups) { if (dtoList.All(a => a.GroupNo != group.Id)) { dtoList.Add(new ChartLogDto() { GroupNo = group.Id, GroupName = group.Name, Matched = 0, NotMatched = 0, }); } } return dtoList.OrderBy(a => a.GroupNo).ToList(); } public async Task GetCampStep(string no) { var log = await GlRepository.GetAll() .Where(a => a.CampNo == no && a.LogCommand == LogCommandDefinition.Step) .OrderByDescending(a => a.CreationTime).FirstOrDefaultAsync(); var dto = log?.LogMessage.Str2Obj(); return dto; } public async Task Voice(string txt, int? rate = null, int? vol = null) { string fileName = $"{DateTime.Now:yyyyMMddHHmmssfff}.wav", filePath = $"/{await SettingManager.GetSettingValueAsync(IwbSettingNames.DownloadPath)}/Voice", fullPath = $"{AppDomain.CurrentDomain.BaseDirectory}/{filePath}"; if (!Directory.Exists(fullPath)) { Directory.CreateDirectory(fullPath); } var task = Task.Run(() => { using (var sp = new SpeechSynthesizer()) using (MemoryStream ms = new MemoryStream()) { sp.Rate = rate ?? 0; sp.Volume = vol ?? 90; //sp.SetOutputToWaveStream(ms); sp.SetOutputToWaveFile($"{fullPath}/{fileName}"); Prompt prompt = new Prompt(txt); sp.Speak(prompt); ms.Position = 0; } }); Task.WaitAll(task); return $"{filePath}/{fileName}"; } } }