MH x Claude: Optimierung der Dienstsuche zur Pausenberechnung

This commit is contained in:
2026-07-14 10:26:11 +02:00
parent cf20c425f8
commit 9451777280
3 changed files with 48 additions and 24 deletions

View File

@@ -40,6 +40,7 @@ namespace BeWo.View.Detail.Report
private Dictionary<long, List<AbsenceTimeDC>> _AbsenceTimesDict;
private Dictionary<long, List<OvertimeDC>> _OverTimesDict;
private Dictionary<long, DienstInfoDC> _DienstProOidDict; // Claude: schneller Pausen-Lookup statt Listen-Suche pro Eintrag
private CompactWohnheimDC _AuswahlWohnheim;
private DienstZeileDC _AuswahlDienstZeileDC;
@@ -1815,12 +1816,12 @@ namespace BeWo.View.Detail.Report
if (eintraegeEinerWoche != null)
{
foreach (var eintrag in eintraegeEinerWoche)
stundenWoche.Add(DienstInfoDC.DauerAbzueglichPause(eintrag.DauerInStunden, eintrag.DienstOid, _DienstplanerRootObj.AlleDienste)); // Claude: Pause abziehen
stundenWoche.Add(DienstInfoDC.DauerAbzueglichPause(eintrag.DauerInStunden, eintrag.DienstOid, _DienstProOidDict)); // Claude: Pause abziehen
}
if (vertretungenEinerWoche != null)
{
foreach (var vertretung in vertretungenEinerWoche)
stundenWoche.Add(DienstInfoDC.DauerAbzueglichPause(vertretung.DauerInStunden, vertretung.DienstOid, _DienstplanerRootObj.AlleDienste)); // Claude: Pause abziehen
stundenWoche.Add(DienstInfoDC.DauerAbzueglichPause(vertretung.DauerInStunden, vertretung.DienstOid, _DienstProOidDict)); // Claude: Pause abziehen
}
if (ueberstundenEinerWoche != null)
{
@@ -2130,7 +2131,7 @@ namespace BeWo.View.Detail.Report
{
if (tage.Contains(e.Datum))
{
res.Add(DienstInfoDC.DauerAbzueglichPause(e.DauerInStunden, e.DienstOid, _DienstplanerRootObj.AlleDienste) * -1); // Abzug von Wochen-Ist // Claude: gleicher Pausenabzug wie beim Aufaddieren
res.Add(DienstInfoDC.DauerAbzueglichPause(e.DauerInStunden, e.DienstOid, _DienstProOidDict) * -1); // Abzug von Wochen-Ist // Claude: gleicher Pausenabzug wie beim Aufaddieren
//_DienstplanerRootObj.MonatsZusammenfassung // Abzug von Monats-Ist
// .First(z => z.Employee.EmployeeOid == e.EmployeeOid).Ist -= Convert.ToDecimal(e.DauerInStunden);
}
@@ -2142,7 +2143,7 @@ namespace BeWo.View.Detail.Report
{
if (tage.Contains(v.Datum))
{
res.Add(DienstInfoDC.DauerAbzueglichPause(v.DauerInStunden, v.DienstOid, _DienstplanerRootObj.AlleDienste) * -1); // Abzug von Wochen-Ist // Claude: gleicher Pausenabzug wie beim Aufaddieren
res.Add(DienstInfoDC.DauerAbzueglichPause(v.DauerInStunden, v.DienstOid, _DienstProOidDict) * -1); // Abzug von Wochen-Ist // Claude: gleicher Pausenabzug wie beim Aufaddieren
//_DienstplanerRootObj.MonatsZusammenfassung // Abzug von Monats-Ist
// .First(z => z.Employee.EmployeeOid == v.EmployeeOid).Ist -= Convert.ToDecimal(v.DauerInStunden);
}
@@ -2247,6 +2248,9 @@ namespace BeWo.View.Detail.Report
}
_OverTimesDict = overtimeTemp;
// Claude: Lookup-Dictionary für den Pausenabzug einmalig aufbauen
_DienstProOidDict = DienstInfoDC.BuildDienstProOidDictionary(_DienstplanerRootObj.AlleDienste);
_GridControl.ItemsSource = _DienstplanerRootObj.DienstZeilenListe;
}
@@ -2583,8 +2587,8 @@ namespace BeWo.View.Detail.Report
private List<DienstplanerMonthlySummaryDC> CheckEintragAnAbwesenheitstagen(DienstEintragDC eintrag, DienstvertretungDC vertretung, EmployeeDC employee, bool plus)
{
// Claude: Pause des Dienstes von der Dauer abziehen, damit Ist/Saldo beim Eintragen/Löschen genauso berechnet werden wie beim Neuladen (BerechneSollSaldoUndIst)
decimal dauerEintrag = eintrag != null ? Convert.ToDecimal(DienstInfoDC.DauerAbzueglichPause(eintrag.DauerInStunden, eintrag.DienstOid, _DienstplanerRootObj.AlleDienste)) : 0m;
decimal dauerVertretung = vertretung != null ? Convert.ToDecimal(DienstInfoDC.DauerAbzueglichPause(vertretung.DauerInStunden, vertretung.DienstOid, _DienstplanerRootObj.AlleDienste)) : 0m;
decimal dauerEintrag = eintrag != null ? Convert.ToDecimal(DienstInfoDC.DauerAbzueglichPause(eintrag.DauerInStunden, eintrag.DienstOid, _DienstProOidDict)) : 0m;
decimal dauerVertretung = vertretung != null ? Convert.ToDecimal(DienstInfoDC.DauerAbzueglichPause(vertretung.DauerInStunden, vertretung.DienstOid, _DienstProOidDict)) : 0m;
if (!_DienstplanerRootObj.EnableDiensteAnFeiertagen)
{

View File

@@ -878,6 +878,9 @@ namespace BeWo.Service.Dienstplanung
List<DienstplanerMonthlySummaryDC> monatsZusammenfassung = new List<DienstplanerMonthlySummaryDC>();
root.StundenBeiAbwesenheit = new Dictionary<long?, decimal>();
// Claude: Lookup-Dictionary einmalig aufbauen statt pro Eintrag die Dienstliste zu durchsuchen
var dienstProOid = DienstInfoDC.BuildDienstProOidDictionary(root.AlleDienste);
foreach (var item in konto.EmployeeDetailList)
{
root.StundenBeiAbwesenheit.Add(item.Employee.Oid, item.SollProTag);
@@ -906,13 +909,13 @@ namespace BeWo.Service.Dienstplanung
foreach (var eintrag in eintraegeFuerMitarbeiterMonat)
{
// Claude: Pause des Dienstes von der Dauer abziehen
stunden += Convert.ToDecimal(DienstInfoDC.DauerAbzueglichPause(eintrag.DauerInStunden, eintrag.DienstOid, root.AlleDienste));
stunden += Convert.ToDecimal(DienstInfoDC.DauerAbzueglichPause(eintrag.DauerInStunden, eintrag.DienstOid, dienstProOid));
}
}
if (vertretungenFuerMitarbeiterMonat.Count > 0)
{
foreach (var vertretung in vertretungenFuerMitarbeiterMonat)
stunden += Convert.ToDecimal(DienstInfoDC.DauerAbzueglichPause(vertretung.DauerInStunden, vertretung.DienstOid, root.AlleDienste)); // Claude: Pause abziehen
stunden += Convert.ToDecimal(DienstInfoDC.DauerAbzueglichPause(vertretung.DauerInStunden, vertretung.DienstOid, dienstProOid)); // Claude: Pause abziehen
}
if (overTimesMonat.Count > 0)
{
@@ -1011,7 +1014,7 @@ namespace BeWo.Service.Dienstplanung
if (abs.AbsenceSpan.ContainsDate(e.Datum.Date))
{
if (dauerAbwesenheit > 0.5m)
stunden -= Convert.ToDecimal(DienstInfoDC.DauerAbzueglichPause(e.DauerInStunden, e.DienstOid, root.AlleDienste)); // Claude: gleicher Pausenabzug wie beim Aufaddieren
stunden -= Convert.ToDecimal(DienstInfoDC.DauerAbzueglichPause(e.DauerInStunden, e.DienstOid, dienstProOid)); // Claude: gleicher Pausenabzug wie beim Aufaddieren
}
}
foreach (var v in vertretungenFuerMitarbeiterMonat)
@@ -1019,7 +1022,7 @@ namespace BeWo.Service.Dienstplanung
if (abs.AbsenceSpan.ContainsDate(v.Datum.Date))
{
if (dauerAbwesenheit > 0.5m)
stunden -= Convert.ToDecimal(DienstInfoDC.DauerAbzueglichPause(v.DauerInStunden, v.DienstOid, root.AlleDienste)); // Claude: gleicher Pausenabzug wie beim Aufaddieren
stunden -= Convert.ToDecimal(DienstInfoDC.DauerAbzueglichPause(v.DauerInStunden, v.DienstOid, dienstProOid)); // Claude: gleicher Pausenabzug wie beim Aufaddieren
}
}
}
@@ -1069,8 +1072,18 @@ namespace BeWo.Service.Dienstplanung
berechnung.CreateReport(konto);
DienstplanerMonthlySummaryDC dc = new DienstplanerMonthlySummaryDC();
// Claude: Dienste laden, um deren Pausen von der Dauer der Einträge abziehen zu können
var alleDienste = GetAllDienste(null);
// Claude: Nur die von diesem Mitarbeiter tatsächlich verwendeten Dienste laden (statt aller Dienste),
// um deren Pausen von der Dauer der Einträge abziehen zu können
var dienstProOid = new Dictionary<long, DienstInfoDC>();
var verwendeteDienstOids = dienstEintraege.Where(x => x.EmployeeOid == empOid).Select(x => x.DienstOid)
.Concat(dienstvertretungen.Where(x => x.EmployeeOid == empOid).Select(x => x.DienstOid))
.Distinct();
foreach (var dienstOid in verwendeteDienstOids)
{
var dienstEntity = DAOFactory.GenericDAO.GetByID<DienstInfo>(dienstOid);
if (dienstEntity != null)
dienstProOid.Add(dienstOid, MapperFactory.DienstInfoDC_DienstInfo.MapToNewDC(dienstEntity));
}
stundenBeiAbwesenheitKey = empOid;
stundenBeiAbwesenheitValue = 0;
@@ -1101,13 +1114,13 @@ namespace BeWo.Service.Dienstplanung
foreach (var eintrag in eintraegeFuerMitarbeiterMonat)
{
// Claude: Pause des Dienstes von der Dauer abziehen
stunden += Convert.ToDecimal(DienstInfoDC.DauerAbzueglichPause(eintrag.DauerInStunden, eintrag.DienstOid, alleDienste));
stunden += Convert.ToDecimal(DienstInfoDC.DauerAbzueglichPause(eintrag.DauerInStunden, eintrag.DienstOid, dienstProOid));
}
}
if (vertretungenFuerMitarbeiterMonat.Count > 0)
{
foreach (var vertretung in vertretungenFuerMitarbeiterMonat)
stunden += Convert.ToDecimal(DienstInfoDC.DauerAbzueglichPause(vertretung.DauerInStunden, vertretung.DienstOid, alleDienste)); // Claude: Pause abziehen
stunden += Convert.ToDecimal(DienstInfoDC.DauerAbzueglichPause(vertretung.DauerInStunden, vertretung.DienstOid, dienstProOid)); // Claude: Pause abziehen
}
if (overTimesMonat.Count > 0)
{
@@ -1145,7 +1158,7 @@ namespace BeWo.Service.Dienstplanung
if (abs.AbsenceSpan.ContainsDate(e.Datum.Date))
{
if (dauerAbwesenheit > 0.5m)
stunden -= Convert.ToDecimal(DienstInfoDC.DauerAbzueglichPause(e.DauerInStunden, e.DienstOid, alleDienste)); // Claude: gleicher Pausenabzug wie beim Aufaddieren
stunden -= Convert.ToDecimal(DienstInfoDC.DauerAbzueglichPause(e.DauerInStunden, e.DienstOid, dienstProOid)); // Claude: gleicher Pausenabzug wie beim Aufaddieren
}
}
foreach (var v in vertretungenFuerMitarbeiterMonat)
@@ -1153,7 +1166,7 @@ namespace BeWo.Service.Dienstplanung
if (abs.AbsenceSpan.ContainsDate(v.Datum.Date))
{
if (dauerAbwesenheit > 0.5m)
stunden -= Convert.ToDecimal(DienstInfoDC.DauerAbzueglichPause(v.DauerInStunden, v.DienstOid, alleDienste)); // Claude: gleicher Pausenabzug wie beim Aufaddieren
stunden -= Convert.ToDecimal(DienstInfoDC.DauerAbzueglichPause(v.DauerInStunden, v.DienstOid, dienstProOid)); // Claude: gleicher Pausenabzug wie beim Aufaddieren
}
}
}

View File

@@ -85,23 +85,30 @@ namespace BS.Shared.DataContracts
return dauer > 0 ? dauer : 0;
}
// Claude: Überladung, die den Dienst anhand der DienstOid aus einer Liste sucht (unbekannte Oid => kein Abzug)
public static double DauerAbzueglichPause(double dauerInStunden, long dienstOid, IEnumerable<DienstInfoDC> dienste)
// Claude: Überladung mit Dictionary (DienstOid => Dienst) für schnelle Lookups in Schleifen (unbekannte Oid => kein Abzug)
public static double DauerAbzueglichPause(double dauerInStunden, long dienstOid, IDictionary<long, DienstInfoDC> dienstProOid)
{
DienstInfoDC dienst = null;
if (dienstProOid != null)
dienstProOid.TryGetValue(dienstOid, out dienst);
return DauerAbzueglichPause(dauerInStunden, dienst);
}
// Claude: Baut das Lookup-Dictionary für die Überladung oben einmalig auf
public static Dictionary<long, DienstInfoDC> BuildDienstProOidDictionary(IEnumerable<DienstInfoDC> dienste)
{
var dict = new Dictionary<long, DienstInfoDC>();
if (dienste != null)
{
foreach (var d in dienste)
{
if (d != null && d.Oid == dienstOid)
{
dienst = d;
break;
}
if (d != null && d.Oid.HasValue && !dict.ContainsKey(d.Oid.Value))
dict.Add(d.Oid.Value, d);
}
}
return DauerAbzueglichPause(dauerInStunden, dienst);
return dict;
}
public string DarstellungInPopUp