using System.Collections.Generic; using System.Data.Entity; using System.Linq; using System.Threading.Tasks; using System.Web.Mvc; using Abp.Application.Services.Dto; using Abp.Auditing; using Abp.Authorization; using Abp.Configuration; using Abp.Domain.Repositories; using Abp.Runtime.Caching; using IwbZero.Auditing; using IwbZero.AppServiceBase; using IwbZero.ToolCommon.StringModel; using Microsoft.AspNet.SignalR; using WeOnlineApp.Authorization; using WeOnlineApp.BaseInfo; using WeOnlineApp.Configuration; using WeOnlineApp.Configuration.Cache; using WeOnlineApp.TrainingCamp.Dto; using WeEngine.CommonDto.WeInfo; using WeOnlineApp.Hubs; using WeOnlineApp.TrainingCampPlay.Dto; namespace WeOnlineApp.TrainingCamp { [AbpAuthorize, AuditLog("培训营信息")] public class CampAppService : IwbAsyncCrudAppService, ICampAppService { public CampAppService( ICacheManager cacheManager, IRepository repository, IRepository sceneMapRepository, IRepository attachRepository) : base(repository, "Id") { SceneMapRepository = sceneMapRepository; AttachRepository = attachRepository; CacheManager = cacheManager; IwbHubContext = GlobalHost.ConnectionManager.GetHubContext(); } protected IHubContext IwbHubContext { get; } protected override bool KeyIsAuto { get; set; } = false; private string DataCenterUrl => SettingManager.GetSettingValue(IwbSettingNames.WeDataCenterIp); protected IRepository AttachRepository { get; } protected IRepository SceneMapRepository { get; } #region GetSelect [DisableAuditing] public override async Task> GetSelectList() { var list = await Repository.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 override async Task GetSelectStr() { var list = await Repository.GetAllListAsync(); string str = ""; foreach (var l in list) { str += $""; } return str; } /// /// 方案包select /// /// [AbpAuthorize(PermissionNames.PagesTrainMgCampMgQuery)] public Task GetPackageSelectStr() { var list = CacheManager.GetPackageInfos(DataCenterUrl); string str = ""; if (list != null && list.Any()) { foreach (var l in list) { str += $""; } } return Task.FromResult(str); } /// /// 附件select /// /// [AbpAuthorize(PermissionNames.PagesTrainMgCampMgAttach)] public async Task GetAttachSelectStr(string no) { var list = await AttachRepository.GetAllListAsync(a => a.TableName == "Train" && a.ColumnName == "Camp" && a.SourceKey.StartsWith(no)); string str = ""; if (list != null && list.Any()) { foreach (var l in list) { str += $""; } } return str; } #endregion GetSelect #region CURD [AbpAuthorize(PermissionNames.PagesTrainMgCampMgCreate)] public override async Task Create(CampCreateDto input) { input.CampState = CampStateDefinition.New; input.Id = await AppGuidManager.GetNextRecordIdAsync(DataLibType.Camp); //if (input.AssessRoleNames.IsEmpty()) //{ // CheckErrors("请配置考核角色后再保存!"); // return; //} await CreateEntity(input); } [AbpAuthorize(PermissionNames.PagesTrainMgCampMgUpdate)] public override async Task Update(CampUpdateDto input) { //if (input.AssessRoleNames.IsEmpty()) //{ // CheckErrors("请配置考核角色后再保存!"); // return; //} await UpdateEntity(input); } /// /// 变更状态 /// /// /// //[AbpAuthorize(PermissionNames.PagesTrainMgCampMgChangeState)] public async Task ChangeState(CampStateDto input) { var entity = await CheckEntity(input.Id); if (input.CampState == CampStateDefinition.Active && entity.EvalBehaviorTags.IsEmpty()) { CheckErrors("请先配置培训营的能力标签,再激活培训营!"); } entity.CampState = input.CampState; await Repository.UpdateAsync(entity); } [AbpAuthorize(PermissionNames.PagesTrainMgCampMgDelete)] public override async Task Delete(EntityDto input) { await CheckEntity(input.Id); await DeleteEntity(input); } [DisableAuditing] [AbpAuthorize(PermissionNames.PagesTrainMgCampMgQuery)] public override async Task> GetAll(IwbPagedRequestDto input) { var query = CreateFilteredQuery(input); query = ApplyFilter(query, input); var totalCount = await AsyncQueryableExecuter.CountAsync(query); query = ApplySorting(query, input); query = ApplyPaging(query, input); var q1 = query.Select(a => new CampDto { Id = a.Id, Name = a.Name, PackageName = a.PackageName, Organizer = a.Organizer, ContactInfo = a.ContactInfo, CampState = a.CampState, RoundScore = a.RoundScore, StartDate = a.StartDate, EndDate = a.EndDate, MaxTrainingMinute = a.MaxTrainingMinute, SubjectPoint = a.SubjectPoint, SubjectType = a.SubjectType }); var entities = await AsyncQueryableExecuter.ToListAsync(q1); var dtoList = new PagedResultDto(totalCount, entities); return dtoList; } #region GetEntity/Dto /// /// 查询实体Dto /// /// /// [DisableAuditing] [AbpAuthorize(PermissionNames.PagesTrainMgCampMgQuery)] public override async Task GetDto(EntityDto input) { var entity = await GetEntity(input); return MapToEntityDto(entity); } /// /// 查询实体Dto /// /// /// [DisableAuditing] [AbpAuthorize(PermissionNames.PagesTrainMgCampMgQuery)] public override async Task GetDtoById(string id) { var entity = await GetEntityById(id); return MapToEntityDto(entity); } /// /// 查询实体Dto(需指明自定义字段) /// /// /// [DisableAuditing] [AbpAuthorize(PermissionNames.PagesTrainMgCampMgQuery)] public override async Task GetDtoByNo(string no) { var entity = await GetEntityByNo(no); return MapToEntityDto(entity); } /// /// 查询实体 /// /// /// [DisableAuditing] [AbpAuthorize(PermissionNames.PagesTrainMgCampMgQuery)] public override async Task GetEntity(EntityDto input) { var entity = await GetEntityById(input.Id); return entity; } /// /// 查询实体 /// /// /// [DisableAuditing] [AbpAuthorize(PermissionNames.PagesTrainMgCampMgQuery)] public override async Task GetEntityById(string id) { return await Repository.FirstOrDefaultAsync(a => a.Id == id); } /// /// 查询实体(需指明自定义字段) /// /// /// [DisableAuditing] [AbpAuthorize(PermissionNames.PagesTrainMgCampMgQuery)] public override async Task GetEntityByNo(string no) { //CheckGetPermission(); if (string.IsNullOrEmpty(KeyFiledName)) { ThrowError("NoKeyFieldName"); } return await base.GetEntityByNo(no); } #endregion GetEntity/Dto #region Hide ///// ///// 根据给定的创建 过滤查询. ///// ///// The input. //protected override IQueryable CreateFilteredQuery(IwbPagedRequestDto input) //{ // var query = Repository.GetAll(); // var pagedInput = input as IIwbPagedRequest; // if (pagedInput == null) // { // return query; // } // if (!string.IsNullOrEmpty(pagedInput.KeyWords)) // { // object keyWords = pagedInput.KeyWords; // LambdaObject obj = new LambdaObject() // { // FieldType = (LambdaFieldType)pagedInput.FieldType, // FieldName = pagedInput.KeyField, // FieldValue = keyWords, // ExpType = (LambdaExpType)pagedInput.ExpType // }; // var exp = obj.GetExp(); // query = exp != null ? query.Where(exp) : query; // } // if (pagedInput.SearchList != null && pagedInput.SearchList.Count > 0) // { // List objList = new List(); // foreach (var o in pagedInput.SearchList) // { // if (string.IsNullOrEmpty(o.KeyWords)) // continue; // object keyWords = o.KeyWords; // objList.Add(new LambdaObject // { // FieldType = (LambdaFieldType)o.FieldType, // FieldName = o.KeyField, // FieldValue = keyWords, // ExpType = (LambdaExpType)o.ExpType // }); // } // var exp = objList.GetExp(); // query = exp != null ? query.Where(exp) : query; // } // return query; //} //protected override IQueryable ApplySorting(IQueryable query, IwbPagedRequestDto input) //{ // return query.OrderBy(a => a.No); //} //protected override IQueryable ApplyPaging(IQueryable query, IwbPagedRequestDto input) //{ // if (input is IPagedResultRequest pagedInput) // { // return query.Skip(pagedInput.SkipCount).Take(pagedInput.MaxResultCount); // } // return query; //} #endregion Hide #endregion CURD #region Attach /// /// 配置附件 /// /// [AbpAuthorize(PermissionNames.PagesTrainMgCampMgAttach), DisableAuditing] public async Task CheckAttach(string no) { var entity = await CheckEntity(no); return $"/Train/CampAttach/{entity.Id}"; } /// /// 配置附件 /// /// [AbpAuthorize(PermissionNames.PagesTrainMgCampMgAttach), AuditLog("配置附件")] public async Task AttachFile(CampSceneAttachDto input) { var entity = await CheckEntity(input.CampNo); var sceneAttach = await SceneMapRepository.FirstOrDefaultAsync(a => a.CampNo == entity.Id && a.SceneNo == input.SceneNo); if (sceneAttach == null) { sceneAttach = new CampSceneMapInfo() { CampNo = input.CampNo, SceneNo = input.SceneNo, SceneName = input.SceneName, AttachNos = input.AttachNos }; await SceneMapRepository.InsertAsync(sceneAttach); } else { sceneAttach.AttachNos = input.AttachNos; await SceneMapRepository.UpdateAsync(sceneAttach); await CurrentUnitOfWork.SaveChangesAsync(); await CacheManager.GetCache(IwbCacheNames.SceneInfoCache).RemoveAsync($"{entity.Id}-{input.SceneNo}"); await CacheManager.GetCache(IwbCacheNames.SceneInfoCache).RemoveAsync($"A-{entity.Id}-{input.SceneNo}"); } } /// /// 删除情景附件 /// /// [AbpAuthorize(PermissionNames.PagesTrainMgCampMgAttach), AuditLog("删除情景附件")] public async Task DeleteAttach(string no) { var sceneAttach = await SceneMapRepository.FirstOrDefaultAsync(a => a.AttachNos.Contains(no)); if (sceneAttach != null) { CheckErrors($"此附件已被配置,无法删除!"); return; } await AttachRepository.DeleteAsync(a => a.AttachNo == no); } /// /// 获取培训营相关附件 /// /// /// /// [AbpAuthorize(PermissionNames.PagesTrainMgCampMgAttach), DisableAuditing] public async Task> GetSceneAttaches(IwbPagedRequestDto input, string no) { //var no = input.SearchList?.FirstOrDefault(a=>a.KeyField=="CampNo")?.KeyWords??""; var entity = await CheckEntity(no); var sceneAttach = await SceneMapRepository.GetAllListAsync(a => a.CampNo == no); var package = GetPackageDetail(entity.PackageNo); var scenes = package.Scenes.IwbDistinct(a => a.Id).ToList(); var totalCount = scenes.Count; var query = scenes.AsQueryable(); scenes = ApplyFilter(query, input).ToList(); scenes = scenes.OrderBy(a => a.Id).Skip(input.SkipCount).Take(input.MaxResultCount).ToList(); var dtoList = new List(); foreach (var scene in scenes) { var dto = new CampSceneAttachDto() { SceneNo = scene.Id, SceneName = scene.Name, CampNo = no, CampName = entity.Name }; var sceneMap = sceneAttach.FirstOrDefault(a => a.SceneNo == scene.Id); if (sceneMap != null) { dto.AttachNos = sceneMap.AttachNos; dto.AttachInfos = new List(); var arr = sceneMap.AttachNos?.Split(','); if (arr != null) { foreach (var aNo in arr) { var attach = await AttachRepository.FirstOrDefaultAsync(a => a.AttachNo == aNo); if (attach != null) { dto.AttachInfos.Add(new CampAttachDto() { AttachNo = aNo, CampNo = no, FileType = attach.FileType, FileTitle = attach.FileTitle, FileName = attach.FileName, FilePath = attach.FilePath }); } } } } dtoList.Add(dto); } return new PagedResultDto(totalCount, dtoList); } /// /// 获取培训营相关附件 /// /// /// /// [AbpAuthorize(PermissionNames.PagesTrainMgCampMgAttach), DisableAuditing] public async Task> GetAttachFiles(IwbPagedRequestDto input, string no) { //var no = input.SearchList?.FirstOrDefault(a=>a.KeyField=="CampNo")?.KeyWords??""; var query = AttachRepository.GetAll() .Where(a => a.TableName == "Train" && a.ColumnName == "Camp" && a.SourceKey.StartsWith(no)).Select(a => new CampAttachDto() { AttachNo = a.AttachNo, CampNo = no, FileName = a.FileName, FilePath = a.FilePath, FileType = a.FileType, FileTitle = a.FileTitle, FileExt = a.FileExt }); query = ApplyFilter(query, input); var totalCount = await AsyncQueryableExecuter.CountAsync(query); query = query.OrderBy(a => a.CampNo); query = query.Skip(input.SkipCount).Take(input.MaxResultCount); var entities = await query.ToListAsync(); return new PagedResultDto(totalCount, entities); } #endregion Attach #region Tag /// /// 配置标签 /// /// [AbpAuthorize(PermissionNames.PagesTrainMgCampMgTag), DisableAuditing] public async Task GetBehaviorTags(string no) { var entity = await CheckEntity(no); var dto = new CampTagDto() { CampNo = no, BehaviorTagNos = entity.EvalBehaviorTags, }; var package = GetPackageDetail(entity.PackageNo); dto.AllTags = package.BehaviorTags.IwbDistinct(a => a.TagNo).OrderBy(a => a.TagNo).ToList(); dto.AllTags = dto.AllTags.OrderBy(a => a.TagNo).ToList(); return dto; } /// /// 配置标签 /// /// [AbpAuthorize(PermissionNames.PagesTrainMgCampMgTag), AuditLog("配置标签")] public async Task BehaviorTag(CampTagDto input) { var entity = await CheckEntity(input.CampNo); entity.EvalBehaviorTags = input.BehaviorTagNos; await Repository.UpdateAsync(entity); await CacheManager.GetCache(IwbCacheNames.CampInfoCache).RemoveAsync($"TAG{input.CampNo}"); } #endregion Tag #region Package /// /// 查询方案包配置信息 /// /// /// /// public async Task GetPackageSetting(string id, string packageNo) { var dto = new PackageSettingDto(); if (packageNo.IsEmpty()) { CheckErrors($"方案包编号不能为空!"); return null; } var package = CacheManager.GetPackageInfo(packageNo, DataCenterUrl); dto.AllRoles = package.AllRoles; dto.AssessAuto = package.AssessAuto; dto.AssessRoleNames = ""; dto.RoundScore = 0; dto.Variable = package.Variable; if (id.IsNotEmpty() && id != "none") { var entity = await Repository.FirstOrDefaultAsync(a => a.Id == id); if (entity == null) { CheckErrors($"未查询编号为【{id}】到培训营!"); return null; } if (entity.PackageNo == packageNo) { dto.AssessAuto = true; dto.AssessRoleNames = entity.AssessRoleNames; dto.RoundScore = entity.RoundScore == 0 ? dto.RoundScore : entity.RoundScore; dto.Variable = entity.Variable.IsEmpty() ? dto.Variable : entity.Variable; } } return dto; } /// /// 方案包详情 /// /// /// [AbpAuthorize(PermissionNames.PagesTrainMgCampMgQuery)] public WePackageDetailDto GetPackageDetail(string no) { var dto = CacheManager.GetPackageDetail(no, DataCenterUrl); return dto; //return await CacheManager.GetCache(IwbCacheNames.PackageInfoCache).GetAsync($"PD{no}", async () => //{ // var url = // $"{(await SettingManager.GetSettingValueAsync(IwbSettingNames.WeDataCenterIp)).Ew("/")}api/services/WePlatform/WePackage/GetPackageDetail?no={no}"; // var result = url.RequestPost(""); // var dto = result.Str2Obj(); // return dto; //}); } #endregion Package [DisableAuditing] public void Chat(ChatDto input) { IwbHubContext.Clients.Group(IwbConsts.ChatNo).getCampChat(new { imagePath = AbpSession.AvatarImagePath, word = input.Msg, userId = AbpSession.UserId ?? 0, userName = AbpSession.UserName, name = AbpSession.RealName, }.Obj2String()); } private async Task CheckEntity(string no) { var entity = await Repository.FirstOrDefaultAsync(a => a.Id == no); if (entity == null) { CheckErrors($"未查询编号为【{no}】到培训营!"); return null; } if (entity.CampState == CampStateDefinition.Active) { CheckErrors("培训营已激活,不能操作!"); } return entity; } } }