full peresobral
This commit is contained in:
66
ftp_parser.py
Normal file
66
ftp_parser.py
Normal 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
|
||||
Reference in New Issue
Block a user