KursblockungDynKurs.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. exports.cast_de_nrw_schule_svws_core_kursblockung_KursblockungDynKurs = exports.KursblockungDynKurs = void 0;
  4. const JavaObject_1 = require("../../java/lang/JavaObject");
  5. const KursblockungOutputKursZuSchiene_1 = require("../../core/data/kursblockung/KursblockungOutputKursZuSchiene");
  6. const System_1 = require("../../java/lang/System");
  7. const LogLevel_1 = require("../../logger/LogLevel");
  8. class KursblockungDynKurs extends JavaObject_1.JavaObject {
  9. guiID;
  10. representation;
  11. fachart;
  12. schienenLage;
  13. schienenLageSaveS;
  14. schienenLageSaveK;
  15. schienenLageFixiert;
  16. schienenFrei;
  17. schienenFreiSaveS;
  18. schienenFreiSaveK;
  19. schuelerAnz = 0;
  20. logger;
  21. /**
  22. * Der Kurs wählt eine zufällige Schienenlage und fügt sich selbst den
  23. * entsprechenden Schienen hinzu.
  24. *
  25. * @param pSchienenLage Ein Array aller Schienen, in denen der Kurs
  26. * gerade liegt.
  27. * @param pSchienenLageFixiert Anzahl an Schienen in {@code pSchienenLage}, die
  28. * fixiert ist.
  29. * @param pSchienenFrei Ein Array aller Schienen, in die der Kurs
  30. * wechseln könnte.
  31. * @param iKurs Alle Informationen zu diesem Kurs. Das Objekt
  32. * stammt von der GUI.
  33. * @param pFachart Die zu diesem Kurs zugehörige Fachart.
  34. * @param pLogger Logger für Benutzerhinweise, Warnungen und
  35. * Fehler.
  36. */
  37. constructor(pSchienenLage, pSchienenLageFixiert, pSchienenFrei, iKurs, pFachart, pLogger) {
  38. super();
  39. this.schienenLage = pSchienenLage;
  40. this.schienenLageFixiert = pSchienenLageFixiert;
  41. this.schienenFrei = pSchienenFrei;
  42. this.guiID = iKurs.id;
  43. this.representation = iKurs.representation;
  44. this.fachart = pFachart;
  45. this.schuelerAnz = 0;
  46. this.logger = pLogger;
  47. this.schienenLageSaveS = Array(this.schienenLage.length).fill(null);
  48. this.schienenLageSaveK = Array(this.schienenLage.length).fill(null);
  49. for (let i = 0; i < this.schienenLage.length; i++) {
  50. this.schienenLageSaveS[i] = this.schienenLage[i];
  51. this.schienenLageSaveK[i] = this.schienenLage[i];
  52. }
  53. this.schienenFreiSaveS = Array(this.schienenFrei.length).fill(null);
  54. this.schienenFreiSaveK = Array(this.schienenFrei.length).fill(null);
  55. for (let i = 0; i < this.schienenFrei.length; i++) {
  56. this.schienenFreiSaveS[i] = this.schienenFrei[i];
  57. this.schienenFreiSaveK[i] = this.schienenFrei[i];
  58. }
  59. for (let i = 0; i < this.schienenLage.length; i++) {
  60. this.schienenLage[i].aktionKursHinzufuegen(this);
  61. }
  62. }
  63. toString() {
  64. return this.representation;
  65. }
  66. /**
  67. * Die Kurs-ID der GUI.
  68. *
  69. * @return Die Kurs-ID der GUI.
  70. */
  71. gibID() {
  72. return this.guiID;
  73. }
  74. /**
  75. * Eine String-Darstellung des Kurses, z.B. 'D;GK1'.
  76. *
  77. * @return Eine String-Darstellung des Kurses, z.B. 'D;GK1'.
  78. */
  79. gibRepresentation() {
  80. return this.representation;
  81. }
  82. /**
  83. * Liefert die zum Kurs zugehörige Fachart.
  84. *
  85. * @return Die zum Kurs zugehörige Fachart.
  86. */
  87. gibFachart() {
  88. return this.fachart;
  89. }
  90. /**
  91. * Liefert die aktuelle Anzahl an Schülern in diesem Kurs.
  92. *
  93. * @return Die aktuelle Anzahl an Schülern in diesem Kurs.
  94. */
  95. gibSchuelerAnzahl() {
  96. return this.schuelerAnz;
  97. }
  98. /**
  99. * Liefert {@code true} falls die Schienenlage des Kurses noch veränderbar ist.
  100. * Wenn der Kurs komplett fixiert ist, oder so viele Schienen gesperrt sind,
  101. * dass der Kurs keine Wahlmöglichkeit bezüglich seiner Schienen hat, dann ist
  102. * das Resultat {@code false}
  103. *
  104. * @return Liefert {@code true}, falls die Schienenlage des Kurses noch
  105. * veränderbar ist.
  106. */
  107. gibHatFreiheitsgrade() {
  108. return (this.schienenLageFixiert < this.schienenLage.length) && (this.schienenFrei.length > 0);
  109. }
  110. /**
  111. * Liefert die aktuelle Schienenlage dieses Kurses.
  112. *
  113. * @return Ein Array, das angibt, in welchen Schienen der Kurs ist. Die Werte
  114. * sind 0-indiziert.
  115. */
  116. gibSchienenLage() {
  117. let length = this.schienenLage.length;
  118. let lage = Array(length).fill(0);
  119. for (let i = 0; i < length; i++) {
  120. lage[i] = this.schienenLage[i].gibNr();
  121. }
  122. return lage;
  123. }
  124. /**
  125. * Liefert die Anzahl an Schienen, die dieser Kurs belegt.
  126. *
  127. * @return Die Anzahl an Schienen, die dieser Kurs belegt.
  128. */
  129. gibSchienenAnzahl() {
  130. return this.schienenLage.length;
  131. }
  132. /**
  133. * Speichert die aktuelle Lage der Schienen im Zustand S, um diese bei Bedarf
  134. * mit der Methode {@link #aktionZustandLadenS} zu laden.
  135. */
  136. aktionZustandSpeichernS() {
  137. System_1.System.arraycopy(this.schienenLage, 0, this.schienenLageSaveS, 0, this.schienenLage.length);
  138. System_1.System.arraycopy(this.schienenFrei, 0, this.schienenFreiSaveS, 0, this.schienenFrei.length);
  139. }
  140. /**
  141. * Speichert die aktuelle Lage der Schienen im Zustand K, um diese bei Bedarf
  142. * mit der Methode {@link #aktionZustandLadenK} zu laden.
  143. */
  144. aktionZustandSpeichernK() {
  145. System_1.System.arraycopy(this.schienenLage, 0, this.schienenLageSaveK, 0, this.schienenLage.length);
  146. System_1.System.arraycopy(this.schienenFrei, 0, this.schienenFreiSaveK, 0, this.schienenFrei.length);
  147. }
  148. /**
  149. * Lädt die zuvor mit der Methode {@link #aktionZustandSpeichernS} gespeicherte
  150. * Lage der Schienen.
  151. */
  152. aktionZustandLadenS() {
  153. this.aktionSchienenLageEntfernen();
  154. System_1.System.arraycopy(this.schienenLageSaveS, 0, this.schienenLage, 0, this.schienenLage.length);
  155. System_1.System.arraycopy(this.schienenFreiSaveS, 0, this.schienenFrei, 0, this.schienenFrei.length);
  156. this.aktionSchienenLageHinzufuegen();
  157. }
  158. /**
  159. * Lädt die zuvor mit der Methode {@link #aktionZustandSpeichernK} gespeicherte
  160. * Lage der Schienen.
  161. */
  162. aktionZustandLadenK() {
  163. this.aktionSchienenLageEntfernen();
  164. System_1.System.arraycopy(this.schienenLageSaveK, 0, this.schienenLage, 0, this.schienenLage.length);
  165. System_1.System.arraycopy(this.schienenFreiSaveK, 0, this.schienenFrei, 0, this.schienenFrei.length);
  166. this.aktionSchienenLageHinzufuegen();
  167. }
  168. /**
  169. * Verteilt den Kurs auf die Schienen zufällig.
  170. */
  171. aktionZufaelligVerteilen() {
  172. if (!this.gibHatFreiheitsgrade()) {
  173. return;
  174. }
  175. if (this.schuelerAnz > 0) {
  176. this.logger.log(LogLevel_1.LogLevel.ERROR, "Kurs.aktionZufaelligVerteilen: schuelerAnz > 0 (Ein Kurs mit SuS darf nicht verteilt werden)");
  177. return;
  178. }
  179. for (let i1 = this.schienenLageFixiert; i1 < this.schienenLage.length; i1++) {
  180. let i2 = (Math.random() * this.schienenFrei.length);
  181. let schiene1 = this.schienenLage[i1];
  182. let schiene2 = this.schienenFrei[i2];
  183. schiene1.aktionKursEntfernen(this);
  184. schiene2.aktionKursHinzufuegen(this);
  185. this.schienenLage[i1] = schiene2;
  186. this.schienenFrei[i2] = schiene1;
  187. }
  188. }
  189. /**
  190. * Setzt die Lage des Kurses auf die in der Liste übergebenen Schienen.
  191. *
  192. * @param pSchienenWahl Die Schienen (0-indiziert), in denen der Kurs liegen
  193. * soll.
  194. */
  195. aktionVerteileAufSchienen(pSchienenWahl) {
  196. for (let iLage = this.schienenLageFixiert; iLage < this.schienenLage.length; iLage++) {
  197. let schieneL = this.schienenLage[iLage];
  198. if (pSchienenWahl.contains(schieneL.gibNr())) {
  199. continue;
  200. }
  201. for (let iFrei = 0; iFrei < this.schienenFrei.length; iFrei++) {
  202. let schieneF = this.schienenFrei[iFrei];
  203. if (pSchienenWahl.contains(schieneF.gibNr())) {
  204. schieneL.aktionKursEntfernen(this);
  205. schieneF.aktionKursHinzufuegen(this);
  206. this.schienenFrei[iFrei] = schieneL;
  207. this.schienenLage[iLage] = schieneF;
  208. break;
  209. }
  210. }
  211. }
  212. }
  213. /**
  214. * Speichert die aktuelle Kurs-Schiene-Zuordnung im Vector
  215. * {@code vKursZuSchiene}.
  216. *
  217. * @param vKursZuSchiene Diesem Vektor wird die aktuelle Kurszuordnung
  218. * hinzugefügt.
  219. */
  220. aktionOutputErzeugen(vKursZuSchiene) {
  221. let kursZuSchiene = new KursblockungOutputKursZuSchiene_1.KursblockungOutputKursZuSchiene();
  222. kursZuSchiene.kurs = this.guiID;
  223. kursZuSchiene.schienen = this.gibSchienenLage();
  224. vKursZuSchiene.add(kursZuSchiene);
  225. }
  226. /**
  227. * Entfernt einen Schüler aus diesem Kurs.
  228. */
  229. aktionSchuelerEntfernen() {
  230. this.fachart.aktionKursdifferenzEntfernen();
  231. this.schuelerAnz--;
  232. this.fachart.aktionSchuelerWurdeEntfernt();
  233. this.fachart.aktionKursdifferenzHinzufuegen();
  234. }
  235. /**
  236. * Fügt einen Schüler diesem Kurs hinzu.
  237. */
  238. aktionSchuelerHinzufügen() {
  239. this.fachart.aktionKursdifferenzEntfernen();
  240. this.schuelerAnz++;
  241. this.fachart.aktionSchuelerWurdeHinzugefuegt();
  242. this.fachart.aktionKursdifferenzHinzufuegen();
  243. }
  244. /**
  245. * Liefert TRUE, wenn die Schiene für den Kurs gesperrt wurde.
  246. *
  247. * @param pSchiene Die Schiene nach der gefragt wurde.
  248. *
  249. * @return TRUE, wenn die Schiene für den Kurs gesperrt wurde.
  250. */
  251. gibIstSchieneGesperrt(pSchiene) {
  252. for (let s of this.schienenLage) {
  253. if (s.gibNr() === pSchiene) {
  254. return false;
  255. }
  256. }
  257. for (let s of this.schienenFrei) {
  258. if (s.gibNr() === pSchiene) {
  259. return false;
  260. }
  261. }
  262. return true;
  263. }
  264. /**
  265. * Liefert TRUE, wenn die Schiene für den Kurs fixiert wurde.
  266. *
  267. * @param pSchiene Die Schiene nach der gefragt wurde.
  268. *
  269. * @return TRUE, wenn die Schiene für den Kurs fixiert wurde.
  270. */
  271. gibIstSchieneFixiert(pSchiene) {
  272. for (let iLage = 0; iLage < this.schienenLageFixiert; iLage++) {
  273. if (this.schienenLage[iLage].gibNr() === pSchiene) {
  274. return true;
  275. }
  276. }
  277. return false;
  278. }
  279. aktionSchienenLageHinzufuegen() {
  280. for (let i = 0; i < this.schienenLage.length; i++) {
  281. this.schienenLage[i].aktionKursHinzufuegen(this);
  282. }
  283. }
  284. aktionSchienenLageEntfernen() {
  285. for (let i = 0; i < this.schienenLage.length; i++) {
  286. this.schienenLage[i].aktionKursEntfernen(this);
  287. }
  288. }
  289. isTranspiledInstanceOf(name) {
  290. return ['de.nrw.schule.svws.core.kursblockung.KursblockungDynKurs'].includes(name);
  291. }
  292. }
  293. exports.KursblockungDynKurs = KursblockungDynKurs;
  294. function cast_de_nrw_schule_svws_core_kursblockung_KursblockungDynKurs(obj) {
  295. return obj;
  296. }
  297. exports.cast_de_nrw_schule_svws_core_kursblockung_KursblockungDynKurs = cast_de_nrw_schule_svws_core_kursblockung_KursblockungDynKurs;
  298. //# sourceMappingURL=KursblockungDynKurs.js.map