Добавил теханализ

This commit is contained in:
2025-11-27 11:36:00 +03:00
parent efb99ea8d5
commit 810d3a8f7f
10 changed files with 859 additions and 16 deletions

View File

@@ -400,6 +400,9 @@ def fill_data_from_df(df: pd.DataFrame, sat: Satellite, current_user=None, is_au
def _create_objitem_from_row(row, sat, source, user_to_use, consts, is_automatic=False):
"""
Вспомогательная функция для создания ObjItem из строки DataFrame.
Теперь ищет дополнительные данные (модуляция, стандарт, символьная скорость)
в таблице TechAnalyze по имени источника и спутнику, если они не указаны в Excel.
Args:
row: строка DataFrame
@@ -420,7 +423,7 @@ def _create_objitem_from_row(row, sat, source, user_to_use, consts, is_automatic
except KeyError:
polarization_obj, _ = Polarization.objects.get_or_create(name="-")
# Обработка ВЧ параметров
# Обработка ВЧ параметров из Excel
freq = remove_str(row["Частота, МГц"])
freq_line = remove_str(row["Полоса, МГц"])
v = remove_str(row["Символьная скорость, БОД"])
@@ -429,8 +432,42 @@ def _create_objitem_from_row(row, sat, source, user_to_use, consts, is_automatic
mod_obj, _ = Modulation.objects.get_or_create(name=row["Модуляция"].strip())
except AttributeError:
mod_obj, _ = Modulation.objects.get_or_create(name="-")
# Ищем данные в TechAnalyze (если не указаны в Excel или указаны как "-")
source_name = row["Объект наблюдения"]
tech_data = None
# Проверяем, нужно ли искать данные в TechAnalyze
# (если модуляция "-" или символьная скорость не указана)
if mod_obj.name == "-" or v == -1.0:
tech_data = _find_tech_analyze_data(source_name, sat)
# Если нашли данные в TechAnalyze, используем их
if tech_data:
if mod_obj.name == "-":
mod_obj = tech_data['modulation']
if v == -1.0:
v = tech_data['bod_velocity']
snr = remove_str(row["ОСШ"])
# Обработка стандарта (если есть в Excel или из TechAnalyze)
try:
standard_name = row.get("Стандарт", "-")
if pd.isna(standard_name) or standard_name == "-":
# Если стандарт не указан в Excel, пытаемся взять из TechAnalyze
if tech_data and tech_data['standard']:
standard_obj = tech_data['standard']
else:
standard_obj, _ = Standard.objects.get_or_create(name="-")
else:
standard_obj, _ = Standard.objects.get_or_create(name=standard_name.strip())
except (KeyError, AttributeError):
# Если столбца "Стандарт" нет, пытаемся взять из TechAnalyze
if tech_data and tech_data['standard']:
standard_obj = tech_data['standard']
else:
standard_obj, _ = Standard.objects.get_or_create(name="-")
# Обработка времени
date = row["Дата"].date()
@@ -510,7 +547,7 @@ def _create_objitem_from_row(row, sat, source, user_to_use, consts, is_automatic
created_by=user_to_use
)
# Создаем Parameter
# Создаем Parameter (с данными из TechAnalyze если они были найдены)
Parameter.objects.create(
id_satellite=sat,
polarization=polarization_obj,
@@ -519,6 +556,7 @@ def _create_objitem_from_row(row, sat, source, user_to_use, consts, is_automatic
bod_velocity=v,
modulation=mod_obj,
snr=snr,
standard=standard_obj,
objitem=obj_item,
)
@@ -817,9 +855,43 @@ def _is_duplicate_objitem(coord_tuple, frequency, freq_range, tolerance=0.1):
return False
def _find_tech_analyze_data(name: str, satellite: Satellite):
"""
Ищет данные технического анализа по имени и спутнику.
Args:
name: имя источника
satellite: объект Satellite
Returns:
dict или None: словарь с данными {modulation, standard, bod_velocity} или None
"""
from .models import TechAnalyze
try:
tech_analyze = TechAnalyze.objects.filter(
name=name,
satellite=satellite
).select_related('modulation', 'standard').first()
if tech_analyze:
return {
'modulation': tech_analyze.modulation,
'standard': tech_analyze.standard,
'bod_velocity': tech_analyze.bod_velocity if tech_analyze.bod_velocity else -1.0
}
except Exception as e:
print(f"Ошибка при поиске TechAnalyze для {name}: {e}")
return None
def _create_objitem_from_csv_row(row, source, user_to_use, is_automatic=False):
"""
Вспомогательная функция для создания ObjItem из строки CSV DataFrame.
Теперь ищет дополнительные данные (модуляция, стандарт, символьная скорость)
в таблице TechAnalyze по имени источника и спутнику.
Args:
row: строка DataFrame
@@ -845,6 +917,9 @@ def _create_objitem_from_csv_row(row, source, user_to_use, is_automatic=False):
name=row["sat"], defaults={"norad": row["norad_id"]}
)
# Ищем данные в TechAnalyze
tech_data = _find_tech_analyze_data(row["obj"], sat_obj)
# Обработка зеркал - теперь это спутники
mirror_names = []
if not pd.isna(row["mir_1"]) and row["mir_1"].strip() != "-":
@@ -901,14 +976,28 @@ def _create_objitem_from_csv_row(row, source, user_to_use, is_automatic=False):
created_by=user_to_use
)
# Создаем Parameter
Parameter.objects.create(
id_satellite=sat_obj,
polarization=pol_obj,
frequency=row["freq"],
freq_range=row["f_range"],
objitem=obj_item,
)
# Создаем Parameter с данными из TechAnalyze (если найдены)
if tech_data:
# Используем данные из TechAnalyze
Parameter.objects.create(
id_satellite=sat_obj,
polarization=pol_obj,
frequency=row["freq"],
freq_range=row["f_range"],
bod_velocity=tech_data['bod_velocity'],
modulation=tech_data['modulation'],
standard=tech_data['standard'],
objitem=obj_item,
)
else:
# Создаем без дополнительных данных (как раньше)
Parameter.objects.create(
id_satellite=sat_obj,
polarization=pol_obj,
frequency=row["freq"],
freq_range=row["f_range"],
objitem=obj_item,
)
# Связываем geo с objitem
geo_obj.objitem = obj_item