adds a sql query for the grouping algorithm

This commit is contained in:
SimonGschnell
2024-06-24 13:08:44 +02:00
parent a0472c6573
commit 008847e490
5 changed files with 137 additions and 29 deletions
@@ -90,16 +90,22 @@ class Stundenplan extends FHCAPI_Controller
$stunden = getData($stunden);
$result = $this->StundenplanModel->getRoomDataOnDay($ort_kurzbz,$start_date,$end_date);
if(isError($result)){
$result = $this->StundenplanModel->groupedRoomPlanning($ort_kurzbz,$start_date,$end_date);
//$this->loglib->logErrorDB(print_r($result,TRUE),"this is the result of the grouped query");
if(isError($result)){
$this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
}
$result = hasData($result) ? getData($result) : [];
$this->loglib->logInfoDB(print_r(count($result),true),"this is the count of the result");
foreach($result as $entry){
if(COUNT($entry->lektor)>1){
// gruppierung hat stattgefunden und das array muss in einem String konvertiert werden
}
}
/*
$final_events = array();
$grouped = array();
$associative_day_events = $this->filterEventsIntoAssociativeDateArray($result, $start_date, $end_date);
@@ -196,9 +202,9 @@ class Stundenplan extends FHCAPI_Controller
$final_events[] = $stunden_events[$event_key];
}
}
}
} */
$this->terminateWithSuccess($final_events);
$this->terminateWithSuccess($result);
}
@@ -18,7 +18,7 @@ class Stundenplan_model extends DB_Model
*
* @return stdClass
*/
public function getRoomDataOnDay($ort_kurzbz,$start_date,$end_date){
public function getRoomDataOnInterval($ort_kurzbz,$start_date,$end_date){
@@ -41,6 +41,98 @@ class Stundenplan_model extends DB_Model
return $raum_stundenplan;
}
/**
* @param string $ort_kurzbz The room to query the planning for
* @param string $start_date The start date of the query interval
* @param string $end_date The end date of the query interval
*
* @return stdClass
*/
public function groupedRoomPlanning($ort_kurzbz,$start_date,$end_date){
$gruppierteRaumVerplannung= $this->execReadOnlyQuery("
SELECT
'reservierung' as type,
NULL as unr,datum, stunde,
titel AS topic,
beschreibung as beschreibung,
string_agg(DISTINCT gruppe, '/') as gruppe,
string_agg(DISTINCT lektor, '/') as lektor,
res.ort_kurzbz,res.studiengang_kz, res.titel, res.beschreibung,NULL as lehreinheit_id,NULL as lehrfach_id,NULL as anmerkung, NULL as fix,NULL as lehrveranstaltung_id,NULL as stg_kurzbzlang,NULL as stg_bezeichnung,NULL as stg_typ, NULL as fachbereich_kurzbz,NULL as lehrfach,NULL as lehrfach_bez,NULL as farbe,NULL as lehrform, NULL as anmerkung_lehreinheit
FROM
(
SELECT
NULL as unr,datum, stunde,
CASE
WHEN gruppe_kurzbz IS NOT NULL THEN gruppe_kurzbz
ELSE CONCAT(UPPER(studg.typ),UPPER(res.stg_kurzbz),'-',COALESCE(CAST(res.semester AS varchar),'/'),COALESCE(CAST(res.verband AS varchar),'/'))
END as gruppe,
CASE
WHEN mit.kurzbz IS NOT NULL THEN mit.kurzbz
ELSE uid
END as lektor,
res.ort_kurzbz,res.studiengang_kz, res.titel, res.beschreibung,NULL as lehreinheit_id,NULL as lehrfach_id,NULL as anmerkung, NULL as fix,NULL as lehrveranstaltung_id,NULL as stg_kurzbzlang,NULL as stg_bezeichnung,NULL as stg_typ, NULL as fachbereich_kurzbz,NULL as lehrfach,NULL as lehrfach_bez,NULL as farbe,NULL as lehrform, NULL as anmerkung_lehreinheit
FROM lehre.vw_reservierung res
LEFT JOIN public.tbl_mitarbeiter mit ON mit.mitarbeiter_uid=uid
JOIN public.tbl_studiengang studg ON studg.studiengang_kz=res.studiengang_kz
WHERE
res.ort_kurzbz = ?
AND res.datum >= ?
AND res.datum <= ?
) as res
GROUP BY res.ort_kurzbz,res.studiengang_kz, res.datum, res.stunde, res.titel, res.beschreibung
UNION ALL
SELECT
'stundenplan' as type,
unr,datum, stunde,
CONCAT(lehrfach,'-',lehrform) as topic,
'' as beschreibung,
string_agg(DISTINCT gruppe, '/') as gruppe,
string_agg(DISTINCT lektor, '/') as lektor,
ort_kurzbz, studiengang_kz, titel,'' as beschreibung,lehreinheit_id,lehrfach_id,anmerkung,fix,lehrveranstaltung_id,stg_kurzbzlang,stg_bezeichnung,stg_typ,fachbereich_kurzbz,lehrfach,lehrfach_bez,farbe,lehrform,anmerkung_lehreinheit
FROM
(
SELECT
unr,datum, stunde,
CASE
WHEN gruppe_kurzbz IS NOT NULL THEN gruppe_kurzbz
ELSE CONCAT(UPPER(sp.stg_typ),UPPER(sp.stg_kurzbz),'-',COALESCE(CAST(sp.semester AS varchar),'/'),COALESCE(CAST(sp.verband AS varchar),'/'))
END as gruppe,
CASE
WHEN sp.mitarbeiter_kurzbz IS NOT NULL THEN sp.mitarbeiter_kurzbz
ELSE lektor
END as lektor,
ort_kurzbz, studiengang_kz, titel,'' as beschreibung,lehreinheit_id,lehrfach_id,anmerkung,fix,lehrveranstaltung_id,stg_kurzbzlang,stg_bezeichnung,stg_typ,fachbereich_kurzbz,lehrfach,lehrfach_bez,farbe,lehrform,anmerkung_lehreinheit
FROM lehre.vw_stundenplan sp
WHERE ort_kurzbz = ?
AND datum >= ?
AND datum <= ?
) as sp
GROUP BY
ort_kurzbz,unr, datum, stunde, lehreinheit_id, lehrfach_id,studiengang_kz,titel,anmerkung,fix,lehrveranstaltung_id,stg_kurzbzlang,stg_bezeichnung,stg_typ,fachbereich_kurzbz,lehrfach,lehrfach_bez,farbe,lehrform,anmerkung_lehreinheit
ORDER BY datum, stunde
", [$ort_kurzbz, $start_date, $end_date, $ort_kurzbz, $start_date, $end_date]);
return $gruppierteRaumVerplannung;
}
/**
* @param string $uid
*
+10
View File
@@ -0,0 +1,10 @@
export default {
getContentID(ort_kurbz) {
return this.$fhcApi.get(
FHC_JS_DATA_STORAGE_OBJECT.app_root +
FHC_JS_DATA_STORAGE_OBJECT.ci_router +
"/api/frontend/v1/Ort/ContentID",
{ ort_kurzbz: ort_kurbz }
);
},
}
+20 -17
View File
@@ -51,7 +51,13 @@ const app = Vue.createApp({
res.data.forEach((el, i) => {
el.id = i;
el.color = '#' + (el.farbe || 'CCCCCC');
if(el.type === 'reservierung')
{
el.color = '#' + (el.farbe || 'FFFFFF');
}else{
el.color = '#' + (el.farbe || 'CCCCCC');
}
el.start = new Date(el.datum + ' ' + this.stunden[el.stunde].beginn);
el.end = new Date(el.datum + ' ' + this.stunden[el.stunde].ende);
el.title = el.lehrfach;
@@ -62,7 +68,8 @@ const app = Vue.createApp({
this.events = res.data;
}
this.$fhcApi.factory.stundenplan.getReservierungen('EDV_F4.26', this.weekFirstDay, this.weekLastDay).then(res => {
// reservierungen are loaded with the stundenplan
/* this.$fhcApi.factory.stundenplan.getReservierungen('EDV_F4.26', this.weekFirstDay, this.weekLastDay).then(res => {
if (res.data && res.data.forEach) {
res.data.forEach((el, i) => {
el.reservierung = true;
@@ -77,11 +84,10 @@ const app = Vue.createApp({
}
let reservierungs_events = res.data;
console.log(reservierungs_events,"this are the reservierungs events that are getting from the db query")
this.events = [...(this.events?this.events:[]),...reservierungs_events];
this.events_loaded = true;
});
}); */
});
@@ -90,22 +96,19 @@ const app = Vue.createApp({
},
template: /*html*/`
<div>
<fhc-calendar v-if="events_loaded" v-slot="{event,day}" :initialDate="currentDate" :events="events" initial-mode="week" show-weeks>
<fhc-calendar v-slot="{event,day}" :initialDate="currentDate" :events="events" initial-mode="week" show-weeks>
<a class="text-decoration-none text-dark" href="#" :title="event.orig.title + ' - ' + event.orig.lehrfach_bez + ' [' + event.orig.ort_kurzbz+']'" >
<div class="d-flex flex-column align-items-center justify-content-evenly h-100" :style="{'background-color':event.orig.color}">
<template v-if="event.orig.reservierung">
<!-- render content for reservierungen -->
<span>{{event.orig.title}}</span>
<span>{{event.orig.gruppe_kurzbz?event.orig.gruppe_kurzbz:event.orig.stg}}</span>
<span v-for="(item, index) in event.orig.person_kurzbz.split('/')" :key="index">{{item}}</span>
</template>
<template v-else>
<!-- render content for stundenplan -->
<span>{{event.orig.lv_info}}</span>
<span v-for="(item, index) in event.orig.stg.split('/')" :key="index">{{item}}</span>
<span >{{event.orig.lektor}}</span>
</template>
<span >{{event.orig.topic}}</span>
<span v-for="gruppe in event.orig.gruppe.split('/')" :key="gruppe">{{gruppe}}</span>
<span v-for="lektor in event.orig.lektor.split('/')" :key="lektor">{{lektor}}</span>
<!-- add the beschreibung if the event is a reservierung -->
<span v-if="event.orig.type === 'reservierung'">{{event.orig.beschreibung}}</span>
</div>
</a>
</fhc-calendar>
+1 -4
View File
@@ -48,7 +48,6 @@ export default {
nextDay.setDate(nextDay.getDate()+1);
nextDay.setMilliseconds(nextDay.getMilliseconds()-1);
let d = {events:[],lanes:1};
console.log("this are the events",this.events, "and this is the key",key)
if (this.events[key]) {
this.events[key].forEach(evt => {
let event = {orig:evt,lane:1,maxLane:1,start: evt.start < day ? day : evt.start, end: evt.end > nextDay ? nextDay : evt.end,shared:[],setSharedMaxRecursive(doneItems) {
@@ -78,9 +77,7 @@ export default {
}
},
methods: {
printTest:function(param){
console.log("HERE",param)
},
changeToMonth(day) {
if (!this.noMonthView) {
this.date.set(day);