1
1
using Google . OrTools . Sat ;
2
+ using Sisgea . GerarHorario . Core . Dtos . Configuracoes ;
2
3
using Sisgea . GerarHorario . Core . Dtos . Entidades ;
3
4
4
5
namespace Sisgea . GerarHorario . Core ;
5
6
7
+ using CombinacaoAula = ( int diaSemanaIso , int intervaloIndex , string turmaId , string diarioId ) ;
8
+
6
9
public class Restricoes
7
10
{
11
+ ///<summary>
12
+ /// UTILITÁRIO: Verifica que um (diaSemanaId, intervalo)
13
+ /// pode ocorer em um conjunto de disponibilidades.
14
+ ///</summary>
8
15
public static bool VerificarIntervaloEmDisponibilidades (
9
16
IEnumerable < DisponibilidadeDia > disponibilidades ,
10
- int diaSemanaIso ,
11
17
#pragma warning disable IDE0060 // Remover o parâmetro não utilizado
18
+ int diaSemanaIso ,
12
19
Intervalo intervalo
13
20
#pragma warning restore IDE0060 // Remover o parâmetro não utilizado
14
21
)
15
22
{
23
+ Console . WriteLine ( "[warn]: TODO: VerificarIntervaloEmDisponibilidades: retornar corretamente" ) ;
24
+
16
25
return disponibilidades . Any ( disponibilidade =>
17
26
{
18
- if ( disponibilidade . DiaSemanaIso == diaSemanaIso )
19
- {
20
- // TODO: retornar corretamente
21
- // return Intervalo.VerificarIntervalo(disponibilidade.Intervalo, intervaloAula)
22
- }
27
+ // TODO: retornar corretamente
28
+
29
+ // if (disponibilidade.DiaSemanaIso == diaSemanaIso)
30
+ // {
31
+ // return Intervalo.VerificarIntervalo(disponibilidade.Intervalo, intervalo)
32
+ // }
33
+ // return false;
34
+
23
35
return true ;
24
36
} ) ;
25
37
}
26
38
39
+ ///<summary>
40
+ /// UTILITÁRIO: Gera uma lista com todas as combinações de aula possíveis
41
+ /// sem respeitar nenhum critério.
42
+ ///</summary>
43
+ public static IEnumerable < CombinacaoAula > GerarTodasAsCombinacoesPossiveisInclusiveIndisponiveis ( GerarHorarioOptions options )
44
+ {
45
+ for ( int diaSemanaIso = options . DiaSemanaInicio ; diaSemanaIso <= options . DiaSemanaFim ; diaSemanaIso ++ )
46
+ {
47
+ for ( int intervaloIndex = 0 ; intervaloIndex < options . HorariosDeAula . Length ; intervaloIndex ++ )
48
+ {
49
+ foreach ( var turma in options . Turmas )
50
+ {
51
+ foreach ( var diario in options . DiariosByTurmaId ( turma . Id ) )
52
+ {
53
+ yield return ( diaSemanaIso , intervaloIndex , turma . Id , diario . Id ) ;
54
+ }
55
+ }
56
+ }
57
+ }
58
+ }
59
+
60
+ ///<summary>
61
+ /// UTILITÁRIO: Gera uma lista com todas as combinações de aula possíveis,
62
+ /// respeitando as disponibilidades da turma e disponibilidades do professor.
63
+ ///</summary>
64
+ public static IEnumerable < CombinacaoAula > GerarCombinacoesComDisponibilidade ( GerarHorarioOptions options )
65
+ {
66
+ foreach ( var combinacao in Restricoes . GerarTodasAsCombinacoesPossiveisInclusiveIndisponiveis ( options ) )
67
+ {
68
+ // =====================================================================================
69
+ var intervaloDeTempo = options . HorarioDeAulaFindByIdStrict ( combinacao . intervaloIndex ) ;
70
+
71
+ var turma = options . TurmaFindByIdStrict ( combinacao . turmaId ) ;
72
+ var diario = options . DiarioFindByIdStrict ( combinacao . diarioId ) ;
73
+
74
+ var professor = options . ProfessorFindByIdStrict (
75
+ diario . ProfessorId ,
76
+ exceptionContext : $ " (diário: { diario . Id } , turma: { turma . Id } )"
77
+ ) ! ;
78
+
79
+ // =====================================================================================
80
+
81
+ var disponivelParaTurma = Restricoes . VerificarIntervaloEmDisponibilidades ( turma . Disponibilidades , combinacao . diaSemanaIso , intervaloDeTempo ) ;
82
+
83
+ // ===================================
84
+
85
+ var disponivelParaProfessor = Restricoes . VerificarIntervaloEmDisponibilidades ( professor . Disponibilidades , combinacao . diaSemanaIso , intervaloDeTempo ) ;
86
+
87
+ // ===================================
88
+
89
+ var disponivel = disponivelParaTurma && disponivelParaProfessor ;
90
+
91
+ // =====================================================================================
92
+
93
+ if ( disponivel )
94
+ {
95
+ yield return combinacao ;
96
+ }
97
+ }
98
+ }
99
+
27
100
///<summary>
28
101
/// RESTRIÇÃO: Diário: respeitar limite de quantidade máxima na semana.
29
102
///</summary>
@@ -77,7 +150,7 @@ public static void AplicarLimiteDeNoMaximoUmDiarioAtivoPorTurmaEmUmHorario(Gerar
77
150
}
78
151
79
152
///<summary>
80
- /// RESTRIÇÃO: PREVENCAO CASO O MESMO PROFESSOR ESTEJA DANDO AULA EM DIAS IGUAIS E EM MESMOS HORARIOS
153
+ /// RESTRIÇÃO: Professor: não ter mais de uma aula ativa ao mesmo tempo.
81
154
///</summary>
82
155
public static void AplicarLimiteDeNoMaximoUmDiarioAtivoPorProfessorEmUmHorario ( GerarHorarioContext contexto )
83
156
{
@@ -90,11 +163,11 @@ public static void AplicarLimiteDeNoMaximoUmDiarioAtivoPorProfessorEmUmHorario(G
90
163
{
91
164
var propostas = from propostaDeAula in contexto . TodasAsPropostasDeAula
92
165
where
93
- propostaDeAula . DiaSemanaIso == diaSemanaIso
94
- &&
95
- propostaDeAula . IntervaloIndex == intervaloIndex
96
- &&
97
- contexto . Options . Turmas . Any ( turma => turma . DiariosDaTurma . Any ( diario => diario . ProfessorId == professor . Id ) )
166
+ propostaDeAula . DiaSemanaIso == diaSemanaIso
167
+ &&
168
+ propostaDeAula . IntervaloIndex == intervaloIndex
169
+ &&
170
+ contexto . Options . ProfessorEstaVinculadoAoDiario ( diarioId : propostaDeAula . DiarioId , professorId : professor . Id )
98
171
select propostaDeAula . ModelBoolVar ;
99
172
100
173
contexto . Model . AddAtMostOne ( propostas ) ;
0 commit comments