Поправил привязку вч загрузки, сделал модальное окно.

This commit is contained in:
2025-11-12 00:04:55 +03:00
parent 5e94086bf0
commit 902eb23bd8
9 changed files with 526 additions and 60 deletions

View File

@@ -447,27 +447,96 @@ def get_vch_load_from_html(file, sat: Satellite) -> None:
sigma_load.save()
def get_frequency_tolerance_percent(freq_range_mhz: float) -> float:
"""
Определяет процент погрешности центральной частоты в зависимости от полосы частот.
Args:
freq_range_mhz (float): Полоса частот в МГц
Returns:
float: Процент погрешности для центральной частоты
Диапазоны:
- 0 - 0.5 МГц (0 - 500 кГц): 0.1%
- 0.5 - 1.5 МГц (500 кГц - 1.5 МГц): 0.5%
- 1.5 - 5 МГц: 1%
- 5 - 10 МГц: 2%
- > 10 МГц: 5%
"""
if freq_range_mhz < 0.5:
return 0.005
elif freq_range_mhz < 1.5:
return 0.01
elif freq_range_mhz < 5.0:
return 0.02
elif freq_range_mhz < 10.0:
return 0.05
else:
return 0.1
def compare_and_link_vch_load(
sat_id: Satellite, eps_freq: float, eps_frange: float, ku_range: float
):
item_obj = ObjItem.objects.filter(parameters_obj__id_satellite=sat_id)
vch_sigma = SigmaParameter.objects.filter(id_satellite=sat_id)
"""
Привязывает SigmaParameter к Parameter на основе совпадения параметров.
Погрешность центральной частоты определяется автоматически в зависимости от полосы частот:
- 0-500 кГц: 0.1%
- 500 кГц-1.5 МГц: 0.5%
- 1.5-5 МГц: 1%
- 5-10 МГц: 2%
- >10 МГц: 5%
Args:
sat_id (Satellite): Спутник для фильтрации
eps_freq (float): Не используется (оставлен для обратной совместимости)
eps_frange (float): Погрешность полосы частот в процентах
ku_range (float): Не используется (оставлен для обратной совместимости)
Returns:
tuple: (количество объектов, количество привязок)
"""
# Получаем все ObjItem с Parameter для данного спутника
item_obj = ObjItem.objects.filter(
parameter_obj__id_satellite=sat_id
).select_related('parameter_obj', 'parameter_obj__polarization')
vch_sigma = SigmaParameter.objects.filter(
id_satellite=sat_id
).select_related('polarization')
link_count = 0
obj_count = len(item_obj)
for idx, obj in enumerate(item_obj):
vch_load = obj.parameters_obj.get()
if vch_load.frequency == -1.0:
obj_count = item_obj.count()
for obj in item_obj:
vch_load = obj.parameter_obj
# Пропускаем объекты с некорректной частотой
if not vch_load or vch_load.frequency == -1.0:
continue
# Определяем погрешность частоты на основе полосы
freq_tolerance_percent = get_frequency_tolerance_percent(vch_load.freq_range)
# Вычисляем допустимое отклонение частоты в МГц
freq_tolerance_mhz = vch_load.frequency * freq_tolerance_percent / 100
# Вычисляем допустимое отклонение полосы в МГц
frange_tolerance_mhz = vch_load.freq_range * eps_frange / 100
for sigma in vch_sigma:
if (
abs(sigma.transfer_frequency - vch_load.frequency) <= eps_freq
and abs(sigma.freq_range - vch_load.freq_range)
<= vch_load.freq_range * eps_frange / 100
and sigma.polarization == vch_load.polarization
):
# Проверяем совпадение по всем параметрам
freq_match = abs(sigma.transfer_frequency - vch_load.frequency) <= freq_tolerance_mhz
frange_match = abs(sigma.freq_range - vch_load.freq_range) <= frange_tolerance_mhz
pol_match = sigma.polarization == vch_load.polarization
if freq_match and frange_match and pol_match:
sigma.parameter = vch_load
sigma.save()
link_count += 1
return obj_count, link_count