/// <summary> /// Agrega un nuevo modulo justo dsp del ultimo que sale /// </summary> /// <param name="lastModule"></param> private void AddNewTrackFromLastModule(TrackModule lastModule) { MeshRenderer lastModuleRender = lastModule.GetComponentInChildren <MeshRenderer>(); var newTrackModule = TrackPool.Instance.Get(GetRandomIndexToPickTrackModule()); newTrackModule.transform.position = new Vector3(0, lastModuleRender.bounds.max.y, lastModuleRender.bounds.max.z - 0.1f); }
private void OnTriggerExit(Collider other) { TrackModule lastModule = other.transform.parent.GetComponent <TrackModule>(); Debug.Log("Se fue el ultimo trackmodule"); if (lastModule != null && lastModule.gameObject.layer == 10) { OnLastTrackModule(lastModule); } }
private void OnTriggerEnter(Collider other) { TrackModule lastModule = other.transform.parent.GetComponent <TrackModule>(); if (lastModule != null) { Debug.Log("Hay que devolver el modulo al pool"); OnReturnModuleToPool(lastModule); } }
/// <summary> /// 流程的一个壳,用来在Thread中运行并测试 /// </summary> private void Go() { var trackModule = new TrackModule(this); //trackModule.NaivePipeline(); try { trackModule.FacePipeLine(); } catch (Exception e) { // handle exception } //trackModule.HandPipeLine(); }
public async Task <Result <ModuleItem> > Handle(Contract request, CancellationToken cancellationToken) { Track track = null; TrackModule moduleConfiguration = null; ModuleItem module = null; decimal? evaluationGrade = 0; if (request.UserRole == "Secretary" || request.UserRole == "Recruiter") { return(Result.Fail <ModuleItem>("Acesso Negado")); } if (String.IsNullOrEmpty(request.Id)) { return(Result.Fail <ModuleItem>("Id do Módulo não Informado")); } var moduleId = ObjectId.Parse(request.Id); ObjectId userId = ObjectId.Parse(request.UserId); var qry = await _db.Database .GetCollection <ModuleItem>("Modules") .FindAsync(x => x.Id == moduleId, cancellationToken: cancellationToken); module = await qry.FirstOrDefaultAsync(cancellationToken : cancellationToken); if (module == null) { return(Result.Fail <ModuleItem>("Módulo não existe")); } if (request.UserRole == "Student" || request.UserRole == "Admin" && !module.Published) { bool isInstructor = module.InstructorId.HasValue && module.InstructorId.Value == userId; if (!isInstructor) { User user = await GetUserById(userId, cancellationToken); var RecommendedModules = new List <ObjectId>(); if (user.ModulesInfo != null) { RecommendedModules = user.ModulesInfo.Select(m => m.Id).ToList(); } if (!RecommendedModules.Contains(module.Id)) { List <ObjectId> trackIds = new List <ObjectId>(); var progressTracksId = await _db.UserTrackProgressCollection .AsQueryable() .Where(x => x.UserId == userId) .Select(x => x.TrackId) .ToListAsync(cancellationToken); trackIds.AddRange(progressTracksId); if (user.TracksInfo != null) { trackIds.AddRange(user.TracksInfo.Select(t => t.Id).ToList()); } trackIds = trackIds.Distinct().ToList(); bool hasAccessByTracks = await CheckModuleInTracks(trackIds, moduleId, cancellationToken); if (hasAccessByTracks) { track = await GetTrackFromModule(trackIds, moduleId, cancellationToken); moduleConfiguration = track.ModulesConfiguration.Where(x => x.ModuleId == moduleId).FirstOrDefault(); } else { return(Result.Fail <ModuleItem>("Acesso Negado")); } } } } foreach (var req in module.Requirements) { req.Title = (await(await _db .Database .GetCollection <ModuleNameItem>("Modules") .FindAsync(x => x.Id == req.ModuleId, cancellationToken: cancellationToken)) .FirstOrDefaultAsync(cancellationToken: cancellationToken)).Title; req.Level = req.RequirementValue.Level; req.Percentage = req.RequirementValue.Percentage; req.RequirementValue = null; } module = await CheckQuestions(module, cancellationToken); module = await CheckTutors(module, cancellationToken); module = await CheckExtraInstructors(module, cancellationToken); //### Enviar tb a lista de trilhas e uma variável para usar data de corte ou não var moduleGrade = Module.GetModulesGrades(_db, new List <ObjectId> { userId }, new List <ObjectId> { moduleId }, moduleConfiguration == null ? null : moduleConfiguration.CutOffDate).Data.FirstOrDefault(); if (moduleGrade != null && moduleGrade.UserGrades != null && moduleGrade.UserGrades.Count > 0) { var userModuleGrade = moduleGrade.UserGrades.First(); module.Grade = userModuleGrade.Grade * 10; } var moduleEvaluationTestsIds = await _db.ValuationTestCollection .AsQueryable() .Where(x => x.CreatedBy == ObjectId.Parse(request.UserId) && x.TestModules.Any(y => y.Id == moduleId) ) .Select(x => x.Id) .ToListAsync(); if (moduleEvaluationTestsIds.Count() > 0 && moduleConfiguration != null) { if (track != null) { module.ModuleConfiguration = moduleConfiguration; } var moduleEvaluationTests = await _db.ValuationTestResponseCollection .AsQueryable() .Where(x => moduleEvaluationTestsIds.Contains(x.TestId) ).ToListAsync(); for (int i = 0; i < moduleEvaluationTests.Count(); i++) { for (int k = 0; k < moduleEvaluationTests[i].Answers.Count; k++) { evaluationGrade += moduleEvaluationTests[i].Answers[k].Grade; } } evaluationGrade = evaluationGrade / moduleEvaluationTestsIds.Count(); //Média aritmética se peso do BDQ e Prova forem zero if (moduleConfiguration.BDQWeight == 0 && moduleConfiguration.EvaluationWeight == 0) { module.Grade = (module.Grade + evaluationGrade) / 2; } else { var BDQDividerWeight = moduleConfiguration.BDQWeight == 0 ? 0 : moduleConfiguration.BDQWeight; var BDQDividendWeight = moduleConfiguration.BDQWeight == 0 ? 1 : moduleConfiguration.BDQWeight; var EvaluationDividerWeight = moduleConfiguration.EvaluationWeight == 0 ? 0 : moduleConfiguration.EvaluationWeight; var EvaluationDividendWeight = moduleConfiguration.EvaluationWeight == 0 ? 1 : moduleConfiguration.EvaluationWeight; module.Grade = (module.Grade * BDQDividendWeight + evaluationGrade * EvaluationDividendWeight) / (BDQDividerWeight + EvaluationDividerWeight); } } return(Result.Ok(module)); }
public async Task <Result <Contract> > Handle(Contract request, CancellationToken cancellationToken) { if (request.UserRole != "Admin" && request.UserRole != "Author") { return(Result.Fail <Contract>("Acesso Negado")); } var mConfigResult = request.ModulesConfiguration.Select(x => TrackModule.Create( ObjectId.Parse(x.ModuleId), x.Title, x.Level, x.Percentage, x.Order, x.Weight, x.CutOffDate, x.BDQWeight, x.EvaluationWeight, x.AlwaysAvailable, x.OpenDate, x.ValuationDate ) ).ToArray(); var mCombinedResult = Result.Combine(mConfigResult); if (mCombinedResult.IsFailure) { return(Result.Fail <Contract>(mCombinedResult.Error)); } if (request.EventsConfiguration == null) { request.EventsConfiguration = new List <ContractTrackEvent>(); } var eConfigResult = request.EventsConfiguration.Select(x => TrackEvent.Create( ObjectId.Parse(x.EventId), ObjectId.Parse(x.EventScheduleId), x.Order, x.Title, x.Weight, x.CutOffDate, x.AlwaysAvailable, x.OpenDate, x.ValuationDate ) ).ToArray(); var eCombinedResult = Result.Combine(eConfigResult); if (eCombinedResult.IsFailure) { return(Result.Fail <Contract>(eCombinedResult.Error)); } var tags = new List <ValueObjects.Tag>(); foreach (var tagStr in request.Tags) { var tag = ValueObjects.Tag.Create(tagStr); tags.Add(tag.Data); } var trackDuration = await GetTrackDuration(request, cancellationToken); ObjectId?profileTestId = null; if (!String.IsNullOrEmpty(request.ProfileTestId)) { profileTestId = ObjectId.Parse(request.ProfileTestId); } var newObject = Track.Create( request.Title, request.Description, request.ImageUrl, eConfigResult.Select(x => x.Data).ToList(), mConfigResult.Select(x => x.Data).ToList(), 0, trackDuration, tags, request.Published, request.CertificateUrl, request.StoreUrl, request.EcommerceUrl, profileTestId, request.ProfileTestName, request.ValidFor ); if (newObject.IsFailure) { return(Result.Fail <Contract>(newObject.Error)); } var newTrack = newObject.Data; if (string.IsNullOrEmpty(request.Id)) { string config = _configuration[$"EcommerceIntegration:Active"]; if (request.CreateInEcommerce.HasValue && request.CreateInEcommerce.Value && config == "True") { var response = await CreateEcommerceProduct(newTrack); string content = await response.Content.ReadAsStringAsync(); if (response.StatusCode == HttpStatusCode.Created) { var parsed = JObject.Parse(content); newTrack.EcommerceProducts = new List <EcommerceProduct>(); newTrack.EcommerceProducts.Add( EcommerceProduct.Create( (long)parsed["product"]["id"], 1, false, null, false, null, null, null, null ).Data ); } else { var error = ErrorLog.Create( ErrorLogTypeEnum.EcommerceIntegration, "create-track", content ).Data; await _db.ErrorLogCollection.InsertOneAsync( error, cancellationToken : cancellationToken ); } } newTrack.RequireUserCareer = request.RequireUserCareer; newTrack.AllowedPercentageWithoutCareerInfo = request.AllowedPercentageWithoutCareerInfo; await _db.TrackCollection.InsertOneAsync( newTrack, cancellationToken : cancellationToken ); request.Id = newTrack.Id.ToString(); } else { var query = await _db.Database .GetCollection <Track>("Tracks") .FindAsync(x => x.Id == ObjectId.Parse(request.Id), cancellationToken: cancellationToken ); var track = await query.FirstOrDefaultAsync( cancellationToken : cancellationToken ); if (track == null) { return(Result.Fail <Contract>("Trilha não Encontrada")); } track.Title = newObject.Data.Title; track.Description = newObject.Data.Description; track.EventsConfiguration = newObject.Data.EventsConfiguration; track.ImageUrl = newObject.Data.ImageUrl; track.ModulesConfiguration = newObject.Data.ModulesConfiguration; track.UpdatedAt = DateTimeOffset.UtcNow; track.Tags = newObject.Data.Tags; track.Duration = newObject.Data.Duration; track.Published = newObject.Data.Published; track.CertificateUrl = newObject.Data.CertificateUrl; track.VideoUrl = request.VideoUrl; track.VideoDuration = request.VideoDuration; track.MandatoryCourseVideo = request.MandatoryCourseVideo.HasValue ? request.MandatoryCourseVideo.Value : false; track.CourseVideoUrl = request.CourseVideoUrl; track.CourseVideoDuration = request.CourseVideoDuration; track.StoreUrl = request.StoreUrl; track.EcommerceUrl = request.EcommerceUrl; track.RequireUserCareer = request.RequireUserCareer; track.AllowedPercentageWithoutCareerInfo = request.AllowedPercentageWithoutCareerInfo; track.ProfileTestId = profileTestId; track.ProfileTestName = request.ProfileTestName; track.ValidFor = request.ValidFor; await _db.TrackCollection.ReplaceOneAsync(t => t.Id == track.Id, track, cancellationToken : cancellationToken ); if (track.EcommerceProducts != null) { string config = _configuration[$"EcommerceIntegration:Active"]; if (config == "True") { foreach (var product in track.EcommerceProducts) { await UpdateEcommerceProduct(track, product.EcommerceId); } } } } return(Result.Ok(request)); }
/// <summary> /// Devuelve el modulo seleccionado a su pool correspondiente. /// </summary> /// <param name="module"></param> private void ReturnModuleToPool(TrackModule module) { TrackPool.Instance.ReturnToPool(module); }