gradesGet.js 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. /**
  2. * ПОЛУЧЕНИЕ СПИСКА ДЕТЕЙ И ОТМЕТОК ДЛЯ ОДНОЙ СТРАНИЦЫ
  3. * Copyright © 2019, А.М.Гольдин. Modified BSD License
  4. */
  5. "use strict";
  6. // В запросе приходят [класс(подгруппа), предмет, учитель]
  7. // Возвращается none либо объект:
  8. // {
  9. // puList: ["ivanov", "petrov", ...],
  10. // pnList: ["Иванов И.", "Петров П.", ...],
  11. // d601: ["нн", "5", ...],
  12. // ...
  13. // }
  14. // Если предмет = '', то возвращаются только puList и pnList, причем
  15. // без заблокированных учащихся
  16. // Если предмет вида = 's000', то это внеурочка, список детей берется из
  17. // pupils.db, где поле facult (это массив) содержит имя класса типа 30М
  18. // В этом случае фамилия учащегося имеет вид "Иванов И.|8Б|"
  19. // Одновременная сортировка двух массивов: первый из логинов, второй из
  20. // фамилий (кириллицей). Сортируется второй массив по алфавиту, а первый
  21. // массив сортируется в соответствии с отсортированным вторым.
  22. // Возвращается массив, состоящий из двух этих отсортированных массивов
  23. const sort2 = (arrLat, arrRus) => {
  24. let arrRusNew = [...arrRus], arrLatNew = [];
  25. arrRusNew.sort((a, b) => a.localeCompare(b, "ru"));
  26. for (let i=0; i<arrRusNew.length; i++) {
  27. let iNew = arrRus.indexOf(arrRusNew[i]);
  28. arrLatNew[i] = arrLat[iNew];
  29. }
  30. return [arrLatNew, arrRusNew];
  31. }
  32. module.exports = async (argsObj) => {
  33. try {
  34. let gr = argsObj[0].substr(0, 20).trim(),
  35. sb = argsObj[1].substr(0, 4).trim(),
  36. lg = argsObj[2].substr(0, 20).trim();
  37. if (!gr || !lg) return "none";
  38. let resp = {},
  39. puListMain = [], puListBlock = [],
  40. pnListMain = [], pnListBlock = [];
  41. // Сначала формируем список учеников данного класса (подгруппы)
  42. // (если предмет равен s000, то это внеурочная группа)
  43. let clName = gr.split('-')[0];
  44. let findTpl = sb !== "s000" ?
  45. {Uclass: clName} :
  46. {$where: function() {
  47. let facField = this.facult;
  48. return facField ? facField.includes(clName) : false;
  49. }};
  50. let pListArr = await dbFind("pupils", findTpl);
  51. if (pListArr.length && gr.includes('-')) // если запрошена подгруппа
  52. pListArr = pListArr.filter(pup => {
  53. if (!pup.groups) return false;
  54. else if (pup.groups.includes(gr)) return true;
  55. else return false;
  56. });
  57. for (let pup of pListArr) {
  58. let newPup = `${pup.Ufamil} ${pup.Uname[0]}.`;
  59. if (sb == "s000") newPup += `|${pup.Uclass}|`;
  60. if (pup.block) {
  61. if(sb) {
  62. puListBlock.push(pup.Ulogin);
  63. pnListBlock.push(newPup);
  64. }
  65. }
  66. else {
  67. puListMain.push(pup.Ulogin); pnListMain.push(newPup);
  68. }
  69. }
  70. if (puListMain.length || puListBlock.length) {
  71. let arr2main = sort2(puListMain, pnListMain);
  72. puListMain = arr2main[0];
  73. pnListMain = arr2main[1];
  74. if (sb) {
  75. let arr2block = sort2(puListBlock, pnListBlock);
  76. puListBlock = arr2block[0];
  77. pnListBlock = arr2block[1];
  78. resp.puList = [...puListMain, ...puListBlock];
  79. resp.pnList = [...pnListMain, ...pnListBlock];
  80. }
  81. else {
  82. resp.puList = puListMain;
  83. resp.pnList = pnListMain;
  84. }
  85. }
  86. else return "{}";
  87. // Теперь формируем объекты (по датам) с отметками (если предмет != 0)
  88. if (sb) {
  89. let grVal = resp.puList.length;
  90. let grResp = await dbFind("grades", {c: gr, s: sb, t: lg});
  91. for (let currGr of grResp) {
  92. if (resp.puList.includes(currGr.p)) {
  93. let i = resp.puList.indexOf(currGr.p);
  94. if (!resp[currGr.d]) { // тогда просто массив ''
  95. resp[currGr.d] = [];
  96. for (let i=0; i<grVal; i++) resp[currGr.d][i] = '';
  97. }
  98. resp[currGr.d][i] = currGr.g;
  99. }
  100. }
  101. }
  102. return JSON.stringify(resp);
  103. }
  104. catch(e) {return "none";}
  105. };