In Treeview bzw. Excel-Export des Migrationsüberblicks werden Nummern nun blau markiert, wenn diese zwar in RuleDesigner migriert wurden, dort aber nocht keine Freigabe erfolgt ist. Hierfür wird der RuleDesigner-Status der Nummern live aus der RuleDesigner-Datenbank abgerufen. Dadurch ergibt sich ein detaillierterer Überblick über den aktuellen Migrationsstand, da der Großteil der Migrationsarbeit erst nach der Migration ins PDM erfolgt (Aufbereitung der Modelle, Zusammenbau der Baugruppe, etc.). Abgesehen davon wird die Bezeichnung der obersten Baugruppe jetzt ebenfalls im Migrationsüberblick angezeigt, was bisher nicht der Fall war. Hierfür wird eine CSV-Datei des SIVAS-Teilestamms zur Baugruppennummer abgeleitet daraus 'Bezeichnung 1' ausgelesen.

This commit is contained in:
2025-03-29 22:19:59 +01:00
parent e2bfa2aac6
commit 22b0cf8afc
7 changed files with 240 additions and 83 deletions
+90 -18
View File
@@ -1,5 +1,6 @@
import os
import json
import pymssql
from configparser import ConfigParser
import pandas as pd
import update_database
@@ -18,9 +19,12 @@ class JsonBasedConfig:
def load_json_from_file(self):
"""lade das json file vom gegeben Pfad in ein json Objekt"""
with open(self._config_path, 'r', encoding='utf-8') as fh:
content = fh.read()
return json.loads(content)
try:
with open(self._config_path, 'r', encoding='utf-8') as fh:
content = fh.read()
return json.loads(content)
except FileNotFoundError:
raise ValueError("Bitte prüfen, ob korrekte Teilenummer, bzw. korrekter Dateiname angegeben wurde.")
def from_json(self, json_str):
"""nimm den Json String zur Initialisierung des Objektes"""
@@ -40,6 +44,61 @@ class CSVBasedConfig:
return pd.read_csv(self._config_path, sep=";", dtype="object")
class SQLBasedConfig:
def __init__(self, server, user, pw, dbase):
self._server = server
self._user = user
self._pw = pw
self._dbase = dbase
def query_db(self, sql_statement) -> list:
"""Führt Datenbankabfrage aus und gibt Daten zurück"""
with pymssql.connect(self._server, self._user, self._pw, self._dbase) as conn:
with conn.cursor(as_dict=True) as cursor:
try:
cursor.execute(sql_statement)
except pymssql.ProgrammingError:
print("SQL-Statement konnte nicht verarbeitet werden!")
raise
ret = cursor.fetchall()
return ret
class RuleDesignerSQLData(SQLBasedConfig):
def __init__(self,
server=os.environ.get("RD_SQL_DATABASE_SERVER"),
user=os.environ.get("RD_SQL_DATABASE_USER"),
pw=os.environ.get("RD_SQL_DATABASE_PW"),
dbase=os.environ.get("RD_SQL_DATABASE_NAME")):
super().__init__(server, user, pw, dbase)
self._rd_statuses = None
@property
def rd_statuses(self) -> dict:
"""Gibt Teilenummer und zugehörigen Status zurück"""
if self._rd_statuses is None:
# Datenbankabfrage aller Teilenummern (codCodice) und der zugehörigen Status (codStatus)
sql_statement = "SELECT [codCodice] AS ID, [codStatus] AS STATUS FROM [FUSION_PDM].[dbo].[CODICI]"
sql_data = self.query_db(sql_statement)
# Jeder Teilenummer den sprechenden Stsatusnamen, statt der internen Statusnummer zuweisen
# Dafür laden der Mapping-Datei für die Statusnummern (z.B. 3 = "FREIGEGEBEN")
rd_status_cfg = IniBasedConfig(os.environ.get("CREMIG_CFG"), "RuleDesignerStatusnamen.cfg")
rd_status_sections = rd_status_cfg.sections()
rd_status_names = rd_status_cfg.get_dict(rd_status_sections[0])
self._rd_statuses = {}
for id_status_dict in sql_data:
id = id_status_dict["ID"]
status = id_status_dict["STATUS"]
self._rd_statuses[id] = rd_status_names[str(status)]
return self._rd_statuses
class SivasAssemblyData(JsonBasedConfig):
"""Auslesen der Assembly-Informationen zu einer angegebenen Baugruppennummer"""
@@ -196,10 +255,12 @@ class MigrationStatus:
def __init__(self, asm_child_ids: tuple, rd_ids: tuple):
self.asm_child_ids = asm_child_ids
self.rd_ids = rd_ids
self._rd_statuses = None
self._overview = None
self._green_ids = None
self._red_ids = None
self._ids_in_rd = None
self._ids_in_progress = None
self._ids_pending = None
@property
def id_status(self) -> dict:
"""Gibt zurück, ob die Stücklistenpositionen der Baugruppe migriert sind, oder nicht"""
@@ -208,27 +269,38 @@ class MigrationStatus:
for child_id in self.asm_child_ids:
self._overview[child_id] = True if child_id in self.rd_ids else False
return self._overview
@property
def green_ids(self) -> list:
def ids_in_rd(self) -> list:
"""Gibt alle Stücklistenpositionen zurück, die migriert sind"""
if self._green_ids is None:
self._green_ids = [id for id, status in self.id_status.items() if status is True]
return self._green_ids
if self._ids_in_rd is None:
self._ids_in_rd = [id for id, status in self.id_status.items() if status is True]
return self._ids_in_rd
@property
def yellow_ids(self) -> list:
"""Gibt migrierte Stücklistenpositionen zurück, die aktuell eine Freigabe der Baugruppe verhindern, da sie sich derzeit in Arbeit befinden"""
pass
def ids_in_progress(self) -> list:
"""Gibt migrierte Stücklistenpositionen zurück, die aktuell eine Freigabe der Baugruppe verhindern, da sie sich in Arbeit befinden"""
if self._ids_in_progress is None:
rd_sql_data = RuleDesignerSQLData()
rd_statuses = rd_sql_data.rd_statuses
self._ids_in_progress = []
for id in self.ids_in_rd:
if rd_statuses[id] != "FREIGEGEBEN":
self._ids_in_progress.append(id)
return self._ids_in_progress
@property
def red_ids(self) -> list:
def ids_pending(self) -> list:
"""Gibt alle Stücklistenpositionen zurück, die noch nicht migriert sind"""
if self._red_ids is None:
self._red_ids = [id for id, status in self.id_status.items() if status is False]
return self._red_ids
if self._ids_pending is None:
self._ids_pending = [id for id, status in self.id_status.items() if status is False]
return self._ids_pending
class TeilestammMetadata(CSVBasedConfig):