This commit is contained in:
2025-08-12 23:53:44 +05:00
parent a882a81180
commit 6af7d54070
13 changed files with 462 additions and 431 deletions

View File

@@ -90,46 +90,57 @@ class ExcelProcessor:
pattern = r'^\d{1,2}:\d{1,2}:\d{6,8}:\d{1,5}$'
return bool(re.match(pattern, text))
def update_excel_with_file_info(self, cadastral_to_file_map: Dict[str, str],
output_file_path: str = None) -> bool:
"""Обновляет Excel файл информацией о найденных файлах и смежных номерах"""
def update_excel_with_cadastral_records(self, cadastral_records: List,
output_file_path: str = None) -> bool:
"""Обновляет Excel файл информацией о найденных кадастровых объектах"""
try:
from models.cadastral_record import CadastralRecord
if self.df is None or self.cadastral_column is None:
print("Excel файл не загружен или не найдена колонка с номерами")
return False
# Создаем карту файл -> множество кадастровых номеров для поиска смежных
file_to_numbers_map = {}
for number, file_path in cadastral_to_file_map.items():
if file_path not in file_to_numbers_map:
file_to_numbers_map[file_path] = set()
file_to_numbers_map[file_path].add(number)
# Создаем карты для быстрого поиска
# номер -> запись объекта
number_to_record = {}
for record in cadastral_records:
# Основной номер
number_to_record[record.main_number] = record
# Все остальные номера тоже ведут к тому же объекту
for number in record.other_numbers:
number_to_record[number] = record
# Добавляем новые колонки
self.df['Найденные файлы'] = ''
self.df['Смежные кадастровые номера'] = ''
self.df['Найден в файле'] = ''
self.df['Основной номер объекта'] = ''
self.df['Дополнительные номера'] = ''
self.df['Кадастровый блок'] = ''
# Заполняем информацию для каждой строки
matched_count = 0
for index, row in self.df.iterrows():
cadastral_number = str(row[self.cadastral_column]).strip()
if cadastral_number in cadastral_to_file_map:
# 1. Получаем файл(ы) где найден номер
main_file_path = cadastral_to_file_map[cadastral_number]
file_name = Path(main_file_path).name
self.df.at[index, 'Найденные файлы'] = file_name
if cadastral_number in number_to_record:
record = number_to_record[cadastral_number]
matched_count += 1
# 2. Находим все смежные кадастровые номера из того же файла
if main_file_path in file_to_numbers_map:
all_numbers_in_file = file_to_numbers_map[main_file_path]
# Исключаем текущий номер из списка смежных
adjacent_numbers = all_numbers_in_file - {cadastral_number}
if adjacent_numbers:
self.df.at[index, 'Смежные кадастровые номера'] = ', '.join(sorted(adjacent_numbers))
# 1. Имя файла
file_name = Path(record.file_path).name
self.df.at[index, 'Найден в файле'] = file_name
# 3. Определяем кадастровый блок (первые три части номера)
cadastral_block = self._extract_cadastral_block(cadastral_number)
# 2. Основной номер объекта
self.df.at[index, 'Основной номер объекта'] = record.main_number
# 3. Дополнительные номера в объекте (без основного)
other_numbers_sorted = sorted(record.other_numbers)
if other_numbers_sorted:
self.df.at[index, 'Дополнительные номера'] = ', '.join(other_numbers_sorted)
else:
self.df.at[index, 'Дополнительные номера'] = ''
# 4. Кадастровый блок (от основного номера)
cadastral_block = self._extract_cadastral_block(record.main_number)
if cadastral_block:
self.df.at[index, 'Кадастровый блок'] = cadastral_block
@@ -138,6 +149,7 @@ class ExcelProcessor:
self.df.to_excel(output_path, index=False, engine='openpyxl')
print(f"Обновленный Excel файл сохранен: {output_path}")
print(f"Найдено совпадений: {matched_count} из {len(self.cadastral_numbers)}")
return True
except Exception as e: