private void AtualizaCalendarioProfessor(List <Professor> profs, List <CalendarioProfessor> calendario_prof, int codCalendario) { foreach (Professor prof in profs) { BD.DiminuiCargaHoraria(_cargaHorariaDiminuir, codCalendario, prof.Codigo); CalendarioProfessor cp = calendario_prof.Where(p => p.Professor_Codigo == prof.Codigo).FirstOrDefault(); if (cp != null) { cp.Carga_Horaria_Disponivel -= _cargaHorariaDiminuir; } } }
public List <CalendarioProva> GerarEscalacao(Calendario c) { List <DataProva> listDataProva = BD.RetornaDatasPorCalendario(c.Codigo); List <Professor> listProfessores = BD.RetornaTodosProfessores(); //PEGA TODOS OS PROFESSORES List <Professor> profsNaoMesarios = listProfessores.Where(p => !p.Mesario && p.Carga_Horaria >= 2).ToList(); //pegar pela carga horaria disponivel List <Disponibilidade> disponibilidades = BD.RetornaDisponibilidade(); //retorna toda disponibilidade List <ProfessorDisciplina> prof_disciplina = BD.RetornaProfessorDisciplina(); List <Turma> todasTurmas = BD.RetornaTurmas(); List <Curso> todosCursos = BD.RetornaCurso(); List <CalendarioProfessor> calendario_prof = BD.RetornaCalendarioProfessor(); int cProva = 0; int segTotal = 0; DateTime dtInicial, dtFim; foreach (DataProva dp in listDataProva) { if (dp.Data.Day == 1 && dp.Data.Month == 11) { continue; } foreach (HoraProva h in dp.Horas) { List <Professor> profReservaMoocaEng = new List <Professor>(); List <Professor> profReservaMooca = new List <Professor>(); List <Professor> profReservaButataEng = new List <Professor>(); List <Professor> profReservaButata = new List <Professor>(); //pega todos os profs na disponibilidade, ignorando o Campus List <Professor> listProfessorN = RetornaListaProfsDisponiveis(disponibilidades, h, dp, profsNaoMesarios); ZeraPontos(listProfessorN); List <Prova> provasEscaladasAtualizar = new List <Prova>(); List <Professor> professorAtualizar = new List <Professor>(); foreach (Prova prova in h.Provas) { dtInicial = DateTime.Now; cProva++; //se ja tem professor escalado, pula pra não escalar dnv if (prova.Professor_Codigo > 0) { continue; } //Se for prova especial, pega professor que da aula praquela disciplina e escala ele, saindo do loop if (prova.Especial) { Professor profL = RetornaProfQueLecionaDisciplinaHorario(prof_disciplina, prova.Disciplina_Codigo, prova.Data, prova.Hora.Hours, c.Ano, prova.Unidade, disponibilidades, listProfessorN, prova.Regime); if (profL != null) { if (profL != null) { prova.Professor_Codigo = profL.Codigo; //Escala prova e atualiza carga_horaria_disponível a cada horario //Pega o Professor pra diminuir a carga horaria disponível do professor que vai aplicar a prova professorAtualizar.Add(profL); //Pega prova pra atualizar provasEscaladasAtualizar.Add(new Prova().Preenche(prova)); //Remove professor da lista, pois o mesmo não pode mais ser escalado nesse horário listProfessorN.Remove(profL); Console.WriteLine(prova.Codigo + " - " + DateTime.Now + " - Escalou DP"); } else { Console.WriteLine(prova.Codigo + " - " + DateTime.Now + " - Não Escalou DP"); } } continue; } //valida se alguma prova daquele horario é na mesma sala, se for já coloca o aplicador igual List <Prova> provaMesmaSala = h.Provas.Where(p => p.Sala_Codigo == prova.Sala_Codigo).ToList(); provaMesmaSala.Remove(prova); bool saiLoop = false; foreach (Prova prv in provaMesmaSala) { if (prv.Professor_Codigo > 0) { prova.Professor_Codigo = prv.Professor_Codigo; professorAtualizar.Add(profsNaoMesarios.Where(p => p.Codigo == prv.Professor_Codigo).FirstOrDefault()); provasEscaladasAtualizar.Add(prova); Console.WriteLine(prova.Codigo + " - " + DateTime.Now + " - Escalou prova mesma sala"); saiLoop = true; } } if (saiLoop) { continue; } List <Professor> profElegivel = new List <Professor>(); bool? ehEngenharia = RetornaSeCursoEhEngenharia(todasTurmas, todosCursos, prova.Turma_Codigo); if (ehEngenharia == null) { //não tem como escalar professor se não sabe se naquele horario ele da aula pra engenharia ou outros. continue; } List <Prova> todasProvasDoDia = dp.RetornaProvasPorDia(); //pega a lista de professores disponiveis naquele dia/horario semestral ou anual de acordo com a prova foreach (Professor prof in listProfessorN) { //valida se professor é responsavel if (ProfessorEResponsavel(prof_disciplina, prof, prova)) { continue; } //valida se professor tem carga horaria disponível pra aplicar a prova CalendarioProfessor cp = calendario_prof.Where(p => p.Professor_Codigo == prof.Codigo).FirstOrDefault(); if (cp != null && cp.Carga_Horaria_Disponivel < 2) { continue; } prof.Carga_Horaria_Disponivel = cp.Carga_Horaria_Disponivel; if (ProfessorPodeAplicarAProva(prof, todasTurmas, todosCursos, ehEngenharia.GetValueOrDefault(), prova.Turma_Codigo, dp.Data, h.Hora.Hours, c.Ano, prova.Unidade, disponibilidades, prova.Regime)) { prof.Pontos += RetornaPontosProfLecionaDisciplina(prof, prova, prof_disciplina); prof.Pontos += RetornaPontosProfAplicouProvaPrimeiroHorario(prof, todasProvasDoDia); List <Prova> provasDiaAnterior = RetornaProvaDiaAnterior(listDataProva, dp); prof.Pontos += RetornaPontosProfAplicouProvaDiaAnterior(prof, provasDiaAnterior, dp.Data); prof.Pontos += RetornaPontosProfResponsavelProvaDiaAnterior(prof, provasDiaAnterior, dp.Data, prof_disciplina); profElegivel.Add(prof); } } if (profElegivel.Count > 0) { profElegivel = profElegivel.OrderBy(p => p.Pontos).ThenByDescending(p => p.Carga_Horaria_Disponivel).ToList(); Professor profSelecionado = profElegivel.FirstOrDefault(); if (profSelecionado != null) { prova.Professor_Codigo = profSelecionado.Codigo; //Escala prova e atualiza carga_horaria_disponível a cada horario //Pega o Professor pra diminuir a carga horaria disponível do professor que vai aplicar a prova professorAtualizar.Add(profSelecionado); //Pega prova pra atualizar provasEscaladasAtualizar.Add(new Prova().Preenche(prova)); //Remove professor da lista, pois o mesmo não pode mais ser escalado nesse horário listProfessorN.Remove(profSelecionado); profElegivel.Remove(profSelecionado); if (prova.Unidade == Unidade.Mooca && ehEngenharia == true) { profReservaMoocaEng.AddRange(profElegivel); } else if (prova.Unidade == Unidade.Mooca) { profReservaMooca.AddRange(profElegivel); } else if (prova.Unidade == Unidade.Butata && ehEngenharia == true) { profReservaButataEng.AddRange(profElegivel); } else if (prova.Unidade == Unidade.Butata) { profReservaButata.AddRange(profElegivel); } Console.WriteLine(prova.Codigo + " - " + DateTime.Now + " - Escalou"); } else { Console.WriteLine(prova.Codigo + " - " + DateTime.Now + " - Não Escalou"); } } else { Console.WriteLine(prova.Codigo + " - " + DateTime.Now + " - Não Escalou"); } dtFim = DateTime.Now; segTotal += (int)(dtFim - dtInicial).TotalSeconds; Console.WriteLine("Segundos: " + (int)(dtFim - dtInicial).TotalSeconds + ". Média: " + (segTotal / cProva) + ". Provas: " + cProva); } //Atualiza Provas, Calendario_has_Professor e adiciona fila reserva no BD AtualizaProvas(provasEscaladasAtualizar); AtualizaCalendarioProfessor(professorAtualizar, calendario_prof, c.Codigo); //GeraListaReservaHorario(h.Provas, calendario_prof, disponibilidades, listProfessorN, c, todasTurmas, todosCursos); GeraListaReservasHorario(h.Provas, profReservaMoocaEng, profReservaMooca, profReservaButataEng, profReservaButata, c, dp.Data, h.Hora); } } Console.WriteLine("Média em seg por prova: " + (segTotal / cProva)); return(BD.RetornaCalendarioProva()); }