66 lines
3.3 KiB
Python
66 lines
3.3 KiB
Python
# 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 |