BOM und BOM by UV läuft

This commit is contained in:
2025-06-24 11:31:02 +02:00
parent c2485849a6
commit ae78724127
+93 -17
View File
@@ -301,6 +301,13 @@ def write_excel_from_json(plines:Polylines, sens2cable: dict, outpath:str, with_
length_summary = defaultdict(float)
sensor_summary = defaultdict(int)
uv_sensor_count = defaultdict(lambda: defaultdict(int))
uv_artnr_count = defaultdict(lambda: defaultdict(int))
uv_artnr_length = defaultdict(lambda: defaultdict(float))
seen_sensors = set()
uv_sensor_mapping = defaultdict(dict)
#Worksheet 1 - Kabellängen nach Kabel-ID
ws1 = wb1.active
ws1.title = "Length by ID"
@@ -311,17 +318,21 @@ def write_excel_from_json(plines:Polylines, sens2cable: dict, outpath:str, with_
ws1.column_dimensions['C'].width = 15
ws1.column_dimensions['D'].width = 25
seen_sensors = set()
for pl in plines.kabel:
length = round(pl.length /1000 , 1) # Umrechnung von mm in m
uv_name = pl.id.split("-")[0]
sensor_name = pl.id.split("-")[-1]
# Sensor Artikelnummern sammeln
sensor_name = pl.id.split("-")[-1] # z.B. "BX0001"
# Globaler Sensor-Count (für erstes Sheet)
if sensor_name not in seen_sensors:
seen_sensors.add(sensor_name)
sensor_summary[pl.s_artinr] += 1
# UV-spezifische Sensor-Mapping-Zwischenspeicherung
if sensor_name not in uv_sensor_mapping[uv_name]:
uv_sensor_mapping[uv_name][sensor_name] = pl.s_artinr
for artnr in sens2cable[pl.id]:
cable_name = ""
if artnr.isdigit():
@@ -329,10 +340,17 @@ def write_excel_from_json(plines:Polylines, sens2cable: dict, outpath:str, with_
ws1.append([pl.id, length, artnr, cable_name])
if "MA" in pl.id:
length_summary[artnr] += math.ceil(length) # Aufrunden von z.b. 10,3 auf 11 m (volle Meter!)
length_summary[artnr] += math.ceil(length) # Aufrunden von z.b. 10,3 auf 11 m (volle Meter!)
uv_artnr_length[uv_name][artnr] += math.ceil(length)
else:
count_summary[artnr] += 1
uv_artnr_count[uv_name][artnr] += 1
# UV-spezifische Sensorzählung (robust, 1x je Sensor pro UV)
for uv_name, sensor_dict in uv_sensor_mapping.items():
for sensor_name, artnr in sensor_dict.items():
uv_sensor_count[uv_name][artnr] += 1
# Worksheet 2 - Kabelnummern und Stückzahlen
ws2 = wb1.create_sheet("Cables SIVAS")
@@ -414,29 +432,87 @@ def write_excel_from_json(plines:Polylines, sens2cable: dict, outpath:str, with_
wb2 = Workbook()
ws1 = wb2.active
ws1.title = "BOM"
ws1.append(["Type", "Art.-Number", "Name (SIVAS)", "Amount (pcs)", "Length (m)"])
ws1.append(["Art.-Number", "Name (SIVAS)", "Amount (pcs)", "Length (m)"])
# Alle Summaries kombinieren
all_summaries = set(count_summary) | set(length_summary) | set(sensor_summary)
for artnr in sorted(all_summaries):
# Sensoren separat auflisten
for artnr in sorted(sensor_summary.keys()):
name = bezeichner_cfg["Sivasnummern"].get(artnr, "")
count = sensor_summary.get(artnr, count_summary.get(artnr, ""))
length = length_summary.get(artnr, "")
typ = "Sensor" if artnr in sensor_summary else "Kabel"
count = sensor_summary[artnr]
if artnr == "":
name = "Keine Artikelnummer vergeben. Layout prüfen."
elif artnr != "" and name =="":
name = (f"Kein Eintrag zu Art.-Nr: {artnr} in bezeichner.cfg.")
elif name == "":
name = f"Kein Eintrag zu Art.-Nr: {artnr} in bezeichner.cfg."
ws1.append([
typ,
artnr,
name,
count,
length if typ == "Kabel" else ""
"" # Sensoren haben keine Länge
])
# Kabel separat auflisten
for artnr in sorted(set(count_summary.keys()) | set(length_summary.keys())):
name = bezeichner_cfg["Sivasnummern"].get(artnr, "")
count = count_summary.get(artnr, "")
length = length_summary.get(artnr, "")
if artnr == "":
name = "Keine Artikelnummer vergeben. Layout prüfen."
elif name == "":
name = f"Kein Eintrag zu Art.-Nr: {artnr} in bezeichner.cfg."
ws1.append([
artnr,
name,
count,
length
])
# Neues Sheet für UV-spezifische Übersicht
ws_uv = wb2.create_sheet("BOM by UV")
ws_uv.append(["UV", "Art.-Number", "Name (SIVAS)", "Amount (pcs)", "Length (m)"])
all_uvs = set(uv_sensor_count.keys()) | set(uv_artnr_count.keys()) | set(uv_artnr_length.keys())
for uv in sorted(all_uvs):
all_artnrs = set()
all_artnrs.update(uv_sensor_count.get(uv, {}).keys())
all_artnrs.update(uv_artnr_count.get(uv, {}).keys())
all_artnrs.update(uv_artnr_length.get(uv, {}).keys())
for artnr in sorted(all_artnrs):
sensor_amount = uv_sensor_count.get(uv, {}).get(artnr, 0)
cable_count = uv_artnr_count.get(uv, {}).get(artnr, 0)
cable_length = uv_artnr_length.get(uv, {}).get(artnr, 0)
name = bezeichner_cfg["Sivasnummern"].get(artnr, "")
# Sensoren separat eintragen (Anzahl)
if sensor_amount > 0:
ws_uv.append([
uv,
artnr,
name,
sensor_amount,
""
])
# a) Nur Anzahl, wenn kein "MA" im Namen
if cable_count > 0 and cable_length == 0:
ws_uv.append([
uv,
artnr,
name,
cable_count,
""
])
# b) Nur Länge, wenn Kabel mit "MA" (Meterware)
if cable_length > 0:
ws_uv.append([
uv,
artnr,
name,
"",
cable_length
])
bom_path = outpath.replace("_cables.xlsx", "_BOM.xlsx")
wb2.save(bom_path)
print(f"BOM saved as an excel file")