full peresobral

This commit is contained in:
2025-07-21 16:59:26 +03:00
parent a6e21a7e59
commit c677e4f8af
11 changed files with 742 additions and 484 deletions

66
ftp_parser.py Normal file
View File

@@ -0,0 +1,66 @@
# ftp_parser.py
import os
import json
import logging
from typing import List, Dict
log = logging.getLogger(__name__)
def process_json_files(directory: str) -> List[Dict]:
"""
Сканирует директорию, читает все .json файлы и извлекает из них данные
о фискальных регистраторах в стандартизированном формате.
:param directory: Путь к директории с JSON файлами.
:return: Список словарей, где каждый словарь представляет один ФР.
"""
if not os.path.isdir(directory):
log.error(f"Указанный путь не является директорией: {directory}")
return []
all_fr_data = []
log.info(f"Начинаю обработку JSON файлов из директории: {directory}")
for filename in os.listdir(directory):
if filename.lower().endswith('.json'):
file_path = os.path.join(directory, filename)
try:
with open(file_path, 'r', encoding='utf-8') as f:
data = json.load(f)
if 'serialNumber' not in data or not data['serialNumber']:
log.warning(f"Пропущен файл {filename}: отсутствует serialNumber.")
continue
# Поля teamviewer_id могут быть написаны по-разному,
# например teamviever_id. Обработаем это.
teamviewer_id = data.get('teamviewer_id') or data.get('teamviever_id')
fr_record = {
'serialNumber': data.get('serialNumber'),
'modelName': data.get('modelName'),
'RNM': data.get('RNM') or '0000000000000000',
'organizationName': data.get('organizationName'),
'fn_serial': data.get('fn_serial') or '0000000000000000',
'datetime_reg': data.get('datetime_reg'),
'dateTime_end': data.get('dateTime_end'),
'ofdName': data.get('ofdName'),
'bootVersion': data.get('bootVersion'),
'ffdVersion': data.get('ffdVersion'), # В примере '120', а не '1.2'. Нужно будет уточнить.
'fnExecution': data.get('fnExecution'),
'INN': data.get('INN'),
'anydesk_id': data.get('anydesk_id'), # Приходят чистые
'teamviewer_id': teamviewer_id, # Приходят чистые
'lastModifiedDate': data.get('current_time')
}
all_fr_data.append(fr_record)
log.debug(f"Успешно обработан файл {filename}. S/N: {fr_record['serialNumber']}")
except json.JSONDecodeError:
log.error(f"Ошибка декодирования JSON в файле: {filename}")
except Exception as e:
log.error(f"Неизвестная ошибка при обработке файла {filename}: {e}")
log.info(f"Обработка JSON файлов завершена. Получено {len(all_fr_data)} записей.")
return all_fr_data