From 2f078c19ab47ee8afd771924e771e9ab46bac3ba Mon Sep 17 00:00:00 2001 From: Damian Wessels Date: Wed, 22 Jan 2025 19:51:20 +0100 Subject: [PATCH] ExcelExporter erweitert --- Schnittstelle/Export/Excel.cs | 122 ++++++++++++++++-- .../Import/XML/v2013/Model/Rohrleitung.cs | 7 + Schnittstelle/Import/XML/v2013/XML2013.cs | 36 +++++- Schnittstelle/Sanierung/Sanierungart.cs | 94 +++++++++++--- 4 files changed, 230 insertions(+), 29 deletions(-) diff --git a/Schnittstelle/Export/Excel.cs b/Schnittstelle/Export/Excel.cs index d1e9336..1df56e3 100644 --- a/Schnittstelle/Export/Excel.cs +++ b/Schnittstelle/Export/Excel.cs @@ -1,11 +1,13 @@ using Schnittstelle.Import.XML.v2013.Model; using Schnittstelle.Sanierung; +using Syncfusion.Drawing; using Syncfusion.XlsIO; using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; +using System.Security.Cryptography; using System.Text; namespace Schnittstelle.Export @@ -42,20 +44,29 @@ namespace Schnittstelle.Export KodierungEnde.Borders[ExcelBordersIndex.EdgeRight].LineStyle = ExcelLineStyle.Thin; KodierungEnde.Borders[ExcelBordersIndex.EdgeTop].LineStyle = ExcelLineStyle.Thin; KodierungEnde.Borders[ExcelBordersIndex.EdgeBottom].LineStyle = ExcelLineStyle.Thick; + + IStyle AnmerkungStyle = workbook.Styles.Add("AnmerkungStyle"); + AnmerkungStyle.ColorIndex = ExcelKnownColors.Custom56; + AnmerkungStyle.Borders.LineStyle = ExcelLineStyle.Medium; + AnmerkungStyle.Borders[ExcelBordersIndex.DiagonalUp].ShowDiagonalLine = false; + AnmerkungStyle.Borders[ExcelBordersIndex.DiagonalDown].ShowDiagonalLine = false; + + + for (int i = 0; i < KanalObjekte.Count; i++) { IWorksheet worksheet = workbook.Worksheets[i]; KanalObjekt k = KanalObjekte[i]; - CalculateHaltung(k, worksheet, sanierungsarten, CellStyle, HeaderStyle, KodierungEnde); + CalculateHaltung(k, worksheet, sanierungsarten, CellStyle, HeaderStyle, KodierungEnde,AnmerkungStyle); } FileStream stream = new FileStream("beurteilung.xlsx", FileMode.Create, FileAccess.ReadWrite); workbook.SaveAs(stream); stream.Dispose(); } - private static void CalculateHaltung(KanalObjekt haltung, IWorksheet worksheet, List sanierungsarten, IStyle cellStyle, IStyle headerStyle, IStyle kodierungEnde) + private static void CalculateHaltung(KanalObjekt haltung, IWorksheet worksheet, List sanierungsarten, IStyle cellStyle, IStyle headerStyle, IStyle kodierungEnde, IStyle AnmerkungStyle) { worksheet.Name = string.Format("{0}", haltung.Stammdaten.Objektbezeichnung); @@ -66,11 +77,12 @@ namespace Schnittstelle.Export { Sanierungart sanArt = sanierungsarten[i]; int mainrow = row; - worksheet.Range[row, 1].Text = "Haltung"; + worksheet.Range[row, 1].Text = "Von - Nach"; worksheet.Range[row, 2].Text = "Straße"; // 5 worksheet.Range[row, 3].Text = "Inspizierte Länge"; // 4 worksheet.Range[row, 4].Text = "Länge"; // 2 worksheet.Range[row, 5].Text = "Tiefe"; // 3 + worksheet.Range[row, 6].Text = "Inspektionsrichtung"; worksheet.Range[row, 7].Text = "Schadensbeschreibung"; //sanArt.Sanierungsbezeichnung; @@ -78,11 +90,15 @@ namespace Schnittstelle.Export worksheet.Range[row, 10].Text = "Material"; row++; - worksheet.Range[row, 1].Text = haltung.Stammdaten.Objektbezeichnung; + string richtung = haltung.Inspektionsdaten.OptischeInspektion[0].Rohrleitung.Inspektionsrichtung_RAW; + string s1 = richtung == "O" ? haltung.Stammdaten.Kante.KnotenZulauf!.Objektbezeichnung : haltung.Stammdaten.Kante.KnotenAblauf!.Objektbezeichnung; + string s2 = richtung == "O" ? haltung.Stammdaten.Kante.KnotenAblauf!.Objektbezeichnung : haltung.Stammdaten.Kante.KnotenZulauf!.Objektbezeichnung; + worksheet.Range[row, 1].Text = string.Format("{0} -> {1}", s1, s2); worksheet.Range[row, 2].Text = haltung.Inspektionsdaten.Lage.Strassename; worksheet.Range[row, 4].Text = haltung.Stammdaten.Kante.Laenge.ToString(); // Länge worksheet.Range[row, 5].Text = "Not Implemented yet"; // Tiefe + worksheet.Range[row, 6].Text = haltung.Inspektionsdaten.OptischeInspektion[0].Rohrleitung.Inspektionsrichtung; worksheet.Range[row, 9].Text = haltung.Inspektionsdaten.OptischeInspektion[0].Rohrleitung.Grunddaten.Profilbreite.ToString(); @@ -156,12 +172,46 @@ namespace Schnittstelle.Export if (sanArt.Massnahmen.TryGetValue(code.Inspektionskode, out Massnahmen)) { - var imass = Massnahmen.Find(x => + List imasses = Massnahmen.FindAll(x => haltung.Inspektionsdaten.OptischeInspektion[0].Rohrleitung.Grunddaten.Profilbreite >= x.DN); - if (imass != null) - { + uint counter = 0; + double Kosten = 0; + bool Schlauchliner = false; + foreach (SanierungMassnahme imas in imasses) + { + if(CheckKuerzel(imas.Begrenzung, code)) + { + Kosten += imas.Kosten; + if(counter == 0) + worksheet.Range[row + j, 9].Text += imas.Beschreibung; + else + worksheet.Range[row + j, 9].Text += "," + imas.Beschreibung; + + if (imas.Beschreibung.Equals("Schlauchliner")) + { + Schlauchliner = true; + double zuschlag = 1; + double tmpLaenge = Convert.ToDouble(haltung.Stammdaten.Kante.Laenge); + if (tmpLaenge < 30) + zuschlag = 1.3; + if (tmpLaenge < 15) + zuschlag = 1.5; + worksheet.Range[row + j, 10].Number = (imas.Kosten * zuschlag) * tmpLaenge; + break; + } + } + counter++; + } + if(!Schlauchliner) + { + worksheet.Range[row + j, 10].Number = Kosten; + } + + if (imasses != null) + { + /* worksheet.Range[row + j, 9].Text = imass.Beschreibung; if (imass.Beschreibung.Equals("Schlauchliner")) @@ -177,6 +227,7 @@ namespace Schnittstelle.Export } else worksheet.Range[row + j, 10].Number = imass.Kosten; + */ } } @@ -203,7 +254,9 @@ namespace Schnittstelle.Export worksheet.Range[row, 10].Formula = string.Format("=(H{0}/100)*J{1}", row, temprow); row++; // Linke seite + worksheet.Range[row, 1].CellStyle = headerStyle; worksheet.Range[row, 1].Text = "Sanierungspriorität"; + worksheet.Range[row, 3].CellStyle = headerStyle; worksheet.Range[row, 3].Text = "Info"; // Auflistung worksheet.Range[row, 7].Text = "Aufrechterhaltung der Vorflut Haltung"; // 12% @@ -214,6 +267,7 @@ namespace Schnittstelle.Export worksheet.Range[row, 1].Text = "kurzfristing"; worksheet.Range[row, 2].Text = "ja oder nein"; worksheet.Range[row, 3].Text = "6-12 Monate"; + worksheet.Range[row, 1, row, 3].CellStyle = cellStyle; // Auflistung worksheet.Range[row, 7].Text = "Kanalreinigung vor Sanierung"; // 2€ /m worksheet.Range[row, 8].Number = Convert.ToDouble(inspizierteLaenge); @@ -224,6 +278,7 @@ namespace Schnittstelle.Export worksheet.Range[row, 1].Text = "mittelfristig"; worksheet.Range[row, 2].Text = "ja oder nein"; worksheet.Range[row, 3].Text = "1 bis 5 Jahre"; + worksheet.Range[row, 1, row, 3].CellStyle = cellStyle; // Auflistung worksheet.Range[row, 7].Text = "Kamerainspektion Abnahme"; // 3€ /m worksheet.Range[row, 8].Number = Convert.ToDouble(inspizierteLaenge); @@ -234,6 +289,7 @@ namespace Schnittstelle.Export worksheet.Range[row, 1].Text = "langfristig"; worksheet.Range[row, 2].Text = "ja oder nein"; worksheet.Range[row, 3].Text = "5 bis 10 Jahre"; + worksheet.Range[row, 1, row, 3].CellStyle = cellStyle; // Auflistung worksheet.Range[row, 7].Text = "Summe netto Haltung"; worksheet.Range[row, 10].Formula = string.Format("=SUM(J{0}:J{1})",temprow,row-1); @@ -245,6 +301,7 @@ namespace Schnittstelle.Export // Linke seite worksheet.Range[row, 1].Text = "Sanierung im Verbund"; worksheet.Range[row, 2].Text = "ja oder nein"; + worksheet.Range[row, 1, row, 2].CellStyle = cellStyle; // Auflistung worksheet.Range[row, 7].Text = "Summe brutto Haltung"; worksheet.Range[row, 10].Formula = string.Format("=SUM(J{0}:J{1})", row - 1, row - 2); @@ -254,8 +311,57 @@ namespace Schnittstelle.Export worksheet.Range[mainrow+1, 3].Text = inspizierteLaenge.ToString(); row += 5; } + + row -= 3; + + worksheet.Range[row, 1].Text = "Haltungsbewertung:"; + worksheet.Range[row + 1, 1, row + 4, 5].Merge(); + worksheet.Range[row + 1, 1, row + 4, 5].CellStyle.Color = ColorTranslator.FromHtml("#FCE4D6"); + row += 6; + worksheet.Range[row, 1].Text = "Sanierungsempfehlung:"; + + row += 2; + worksheet.Range[row, 1].Text = "Hinweis:"; + + + row++; + worksheet.Range[row, 1].Text = "TV-Befahrung:"; + worksheet.Range[row, 2].Text = "Sohle sichtbar:"; + worksheet.Range[row, 4].Text = "% Wasser in der Sohle"; worksheet.UsedRange.AutofitColumns(); - worksheet.Range[string.Format("J1:J{0}",row)].NumberFormat = "€#0"; + worksheet.Range[string.Format("J1:J{0}", row)].NumberFormat = "_(€* #,##0_)"; // "€ #,##0"; + + row += 3; + + + } + + private static bool CheckKuerzel(string begrenzung, RZustand code) + { + string[] begrenzungs = begrenzung.Split(':'); + string ch1 = begrenzungs[1]; + string ch2 = begrenzungs[2]; + + bool check1 = false; + bool check2 = false; + if(ch1 != "-") + { + check1 = ch1 == code.Charakterisierung1; + } + else + { + check1 = true; + } + + if (ch2 != "-") + { + check2 = ch2 == code.Charakterisierung2; + } + else + { + check2 = true; + } + return check1 && check2; } } } diff --git a/Schnittstelle/Import/XML/v2013/Model/Rohrleitung.cs b/Schnittstelle/Import/XML/v2013/Model/Rohrleitung.cs index aa18fe2..9eb117d 100644 --- a/Schnittstelle/Import/XML/v2013/Model/Rohrleitung.cs +++ b/Schnittstelle/Import/XML/v2013/Model/Rohrleitung.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; namespace Schnittstelle.Import.XML.v2013.Model { @@ -34,6 +35,12 @@ namespace Schnittstelle.Import.XML.v2013.Model inspektionslaenge = value; } } + + public string Inspektionsrichtung_RAW + { + get => inspektionsrichtung; + } + public string Inspektionsrichtung { get diff --git a/Schnittstelle/Import/XML/v2013/XML2013.cs b/Schnittstelle/Import/XML/v2013/XML2013.cs index c7a8cf7..1e24643 100644 --- a/Schnittstelle/Import/XML/v2013/XML2013.cs +++ b/Schnittstelle/Import/XML/v2013/XML2013.cs @@ -13,6 +13,12 @@ using System.Xml; namespace Schnittstelle.Import.XML.v2013 { + + public class NotZustandException: Exception + { + + } + public class XML2013 : ISchnittstelleImporter { private string xmlFile = ""; @@ -78,6 +84,7 @@ namespace Schnittstelle.Import.XML.v2013 Tuple, List> src = LoadRawFile(); stammdaten = src.Item1; inspektionsdaten = src.Item2; + if (inspektionsdaten.Count == 0) Console.WriteLine("Keine Inspektionsdaten gefunden in der XML"); foreach (InspizierteAbwassertechnischeAnlage iat in inspektionsdaten) { AbwassertechnischeAnlage stammdatens = stammdaten.Find(x => x.Objektbezeichnung.Equals(iat.Objektbezeichnung) && x.ObjektArt.Equals(EObjektArt.KANTE));//; @@ -109,13 +116,34 @@ namespace Schnittstelle.Import.XML.v2013 rootChild = rootChild.SelectSingleNode("//e:Datenkollektive", manager); Stammdaten = LoadStammdatenCollectiv(); - Inspektionsdaten = LoadInspektionsdatenCollectiv(); + try + { + Inspektionsdaten = LoadInspektionsdatenCollectiv(); + } + catch (NotZustandException ex) + { + Inspektionsdaten = new List(); + } return new Tuple, List>(Stammdaten, Inspektionsdaten); } private List LoadInspektionsdatenCollectiv() { List result = new List(); + + bool found = false; + + foreach(XmlNode childNode in rootChild.ChildNodes) + { + if(childNode.Name.Equals("Zustandsdatenkollektiv")) + { + found = true; + break; + } + } + + if (!found) throw new NotZustandException(); + XmlNode zstdk = rootChild.SelectSingleNode("//e:Zustandsdatenkollektiv", manager); XmlNodeList Inspektionsdaten = zstdk.SelectNodes("//e:InspizierteAbwassertechnischeAnlage", manager); @@ -604,6 +632,8 @@ namespace Schnittstelle.Import.XML.v2013 case "Hochwert": result.Hochwert = ConvertXMLToDecimal(s.InnerText); break; case "Punkthoehe": result.Punkthoehe = ConvertXMLToDecimal(s.InnerText); break; case "PunktattributAbwasser": result.PunktattributAbwasser = s.InnerText; break; + case "Lagegenauigkeitsstufe": break; + case "Hoehengenauigkeitsstufe": break; default: throw new NotImplementedException(s.Name); } } @@ -646,6 +676,8 @@ namespace Schnittstelle.Import.XML.v2013 case "PunktattributAbwasser": punkt.PunktattributeAbwasser = s.InnerText; break; + case "Lagegenauigkeitsstufe": break; + case "Hoehengenauigkeitsstufe": break; default: throw new NotImplementedException(s.Name); } } @@ -693,6 +725,8 @@ namespace Schnittstelle.Import.XML.v2013 break; case "Leitung": break; + case "Anschlussdaten": + break; default: throw new NotImplementedException(s.Name); } } diff --git a/Schnittstelle/Sanierung/Sanierungart.cs b/Schnittstelle/Sanierung/Sanierungart.cs index db16fcd..4b2aae5 100644 --- a/Schnittstelle/Sanierung/Sanierungart.cs +++ b/Schnittstelle/Sanierung/Sanierungart.cs @@ -6,7 +6,7 @@ using System.Text; namespace Schnittstelle.Sanierung { - public class SanierungMassnahme + public class SanierungMassnahme { private string begrenzung = string.Empty; string beschreibung = string.Empty; @@ -18,7 +18,7 @@ namespace Schnittstelle.Sanierung public double Kosten { get => kosten; } public int DN { get => dn; } - public SanierungMassnahme(string beschreibung, double kosten, int dn,string begrenzung = "-:-") + public SanierungMassnahme(string beschreibung, double kosten, int dn, string begrenzung = "-:-:-") { this.beschreibung = beschreibung; this.kosten = kosten; @@ -26,13 +26,13 @@ namespace Schnittstelle.Sanierung this.begrenzung = begrenzung; } } - + public abstract class Sanierungart { string sanierungsbezeichnung = string.Empty; - public string Sanierungsbezeichnung { get => sanierungsbezeichnung; } + public string Sanierungsbezeichnung { get => sanierungsbezeichnung; } public Dictionary> Sanierungen = new Dictionary>(); - + protected Dictionary> massnahmen = new Dictionary>(); @@ -45,41 +45,95 @@ namespace Schnittstelle.Sanierung public class Reparatur : Sanierungart { - + public Reparatur() : base("Reparatur") { - + massnahmen.Add("BAB", new List() + { + new SanierungMassnahme("Kurzliner",450,0) + }); + massnahmen.Add("BAG", new List() + { + new SanierungMassnahme("Fräsen",50,0) + }); + massnahmen.Add("BAH", new List() + { + new SanierungMassnahme("Fräsen",50,0,"BAH:C:-"), + new SanierungMassnahme("Hut",400,0,"BAH:C:-") + }); + massnahmen.Add("BAI", new List() + { + new SanierungMassnahme("Fräsen",50,0) + }); + massnahmen.Add("BAJ", new List() + { + new SanierungMassnahme("Fräsen",50,0) + }); + massnahmen.Add("BBA", new List() + { + new SanierungMassnahme("Fräsen",50,0) + }); + massnahmen.Add("BBB", new List() + { + new SanierungMassnahme("Fräsen",50,0) + }); + massnahmen.Add("BBC", new List() + { + new SanierungMassnahme("Fräsen",50,0) + }); + massnahmen.Add("BCA", new List() + { + new SanierungMassnahme("Tittensanierung",600,0,"BCA:C:-"), + new SanierungMassnahme("Tittensanierung",600,0,"BCA:E:-") + }); } } public class Renovation : Sanierungart { - + public Renovation() : base("Renovation") { BCA(); BCE(); + + + massnahmen.Add("BAJ", new List() + { + new SanierungMassnahme("Fräsen",50,0) + }); + massnahmen.Add("BBA", new List() + { + new SanierungMassnahme("Fräsen",50,0) + }); + massnahmen.Add("BBB", new List() + { + new SanierungMassnahme("Fräsen",50,0) + }); + massnahmen.Add("BBC", new List() + { + new SanierungMassnahme("Fräsen",50,0) + }); } void BCA() { List bca = new List(); - bca.Add(new SanierungMassnahme("Einmessen",10,0,"BCA:-:A")); - bca.Add(new SanierungMassnahme("Öffnen",100,0,"BCA:-:A")); - bca.Add(new SanierungMassnahme("Hut",380,0,"BCA:-:A")); - massnahmen.Add("BCA",bca); + bca.Add(new SanierungMassnahme("Einmessen", 100, 0, "BCA:-:-")); + bca.Add(new SanierungMassnahme("Öffnen", 100, 0, "BCA:-:A")); + bca.Add(new SanierungMassnahme("Stsan", 600, 0, "BCA:-:A")); + massnahmen.Add("BCA", bca); } void BCE() { List bce = new List(); - bce.Add(new SanierungMassnahme("Schlauchliner",100,200)); - bce.Add(new SanierungMassnahme("Schlauchliner",105,250)); - bce.Add(new SanierungMassnahme("Schlauchliner",110,300)); - bce.Add(new SanierungMassnahme("Schlauchliner",120,400)); - bce.Add(new SanierungMassnahme("Schlauchliner",130,500)); - bce.Add(new SanierungMassnahme("Schlauchliner",140,600)); - - + bce.Add(new SanierungMassnahme("Schlauchliner", 100, 200)); + bce.Add(new SanierungMassnahme("Schlauchliner", 105, 250)); + bce.Add(new SanierungMassnahme("Schlauchliner", 110, 300)); + bce.Add(new SanierungMassnahme("Schlauchliner", 120, 400)); + bce.Add(new SanierungMassnahme("Schlauchliner", 130, 500)); + bce.Add(new SanierungMassnahme("Schlauchliner", 140, 600)); + massnahmen.Add("BCE", bce); } }