/** * Скрипт для проверки синхронизации deployments между WellNuo DB и Legacy API * * Проверяет: * 1. Все beneficiaries в нашей БД * 2. Их legacy_deployment_id * 3. Существуют ли эти deployments в Legacy API */ const https = require('https'); const { Client } = require('pg'); require('dotenv').config(); // Legacy API credentials const LEGACY_API = { host: 'eluxnetworks.net', path: '/function/well-api/api', user: process.env.LEGACY_API_USERNAME || 'robster', token: process.env.LEGACY_API_TOKEN }; // WellNuo DB credentials const DB_CONFIG = { host: process.env.DB_HOST, port: parseInt(process.env.DB_PORT || '5432'), database: process.env.DB_NAME, user: process.env.DB_USER, password: process.env.DB_PASSWORD, connectionTimeoutMillis: 15000, ssl: { rejectUnauthorized: false } }; // Helper: make Legacy API request function legacyRequest(params) { return new Promise((resolve, reject) => { const querystring = require('querystring'); const data = querystring.stringify({ user_name: LEGACY_API.user, token: LEGACY_API.token, ...params }); const options = { hostname: LEGACY_API.host, path: LEGACY_API.path, method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded', 'Content-Length': data.length } }; const req = https.request(options, (res) => { let body = ''; res.on('data', (chunk) => body += chunk); res.on('end', () => { try { resolve(JSON.parse(body)); } catch (e) { resolve({ error: 'Invalid JSON', raw: body.substring(0, 200) }); } }); }); req.on('error', reject); req.write(data); req.end(); }); } async function main() { console.log('='.repeat(70)); console.log('ПРОВЕРКА СИНХРОНИЗАЦИИ DEPLOYMENTS: WellNuo DB ↔ Legacy API'); console.log('='.repeat(70)); console.log(); // 1. Получаем список deployments из Legacy API console.log('1. Загружаем deployments из Legacy API...'); const legacyDeployments = await legacyRequest({ function: 'deployments_list', first: '0', last: '500' }); const legacyIds = new Set(); if (legacyDeployments.result_list) { legacyDeployments.result_list.forEach(d => legacyIds.add(d.deployment_id)); console.log(` Найдено ${legacyDeployments.result_list.length} deployments в Legacy API`); console.log(` IDs: ${[...legacyIds].sort((a,b) => a-b).join(', ')}`); } else { console.log(' ОШИБКА: не удалось получить список из Legacy API'); console.log(' Response:', JSON.stringify(legacyDeployments)); } console.log(); // 2. Подключаемся к WellNuo DB console.log('2. Загружаем данные из WellNuo DB...'); const client = new Client(DB_CONFIG); try { await client.connect(); console.log(' Подключение к БД успешно'); // Получаем всех beneficiaries с их deployments const result = await client.query(` SELECT b.id as beneficiary_id, b.name as beneficiary_name, b.equipment_status, bd.id as deployment_id, bd.name as deployment_name, bd.legacy_deployment_id, bd.is_primary FROM beneficiaries b LEFT JOIN beneficiary_deployments bd ON b.id = bd.beneficiary_id ORDER BY b.id `); console.log(` Найдено ${result.rows.length} записей`); console.log(); // 3. Анализ console.log('3. АНАЛИЗ СИНХРОНИЗАЦИИ:'); console.log('-'.repeat(70)); console.log( 'Ben.ID'.padEnd(8) + 'Имя'.padEnd(20) + 'Deploy.ID'.padEnd(12) + 'Legacy ID'.padEnd(12) + 'Статус Legacy' ); console.log('-'.repeat(70)); let okCount = 0; let missingCount = 0; let nullCount = 0; const problems = []; for (const row of result.rows) { const legacyId = row.legacy_deployment_id; const name = (row.beneficiary_name || '').substring(0, 18); let status; if (legacyId === null) { status = '⚠️ NULL'; nullCount++; problems.push({ beneficiaryId: row.beneficiary_id, name, deploymentId: row.deployment_id, legacyId: null, issue: 'legacy_deployment_id is NULL' }); } else if (legacyIds.has(legacyId)) { status = '✅ EXISTS'; okCount++; } else { status = '❌ NOT FOUND'; missingCount++; problems.push({ beneficiaryId: row.beneficiary_id, name, deploymentId: row.deployment_id, legacyId, issue: `Legacy deployment ${legacyId} does not exist` }); } console.log( String(row.beneficiary_id).padEnd(8) + name.padEnd(20) + String(row.deployment_id || '-').padEnd(12) + String(legacyId || 'NULL').padEnd(12) + status ); } console.log('-'.repeat(70)); console.log(); // 4. Итоги console.log('4. ИТОГИ:'); console.log(` ✅ Синхронизированы: ${okCount}`); console.log(` ⚠️ NULL legacy_id: ${nullCount}`); console.log(` ❌ Не существуют: ${missingCount}`); console.log(); if (problems.length > 0) { console.log('5. ПРОБЛЕМНЫЕ ЗАПИСИ (нужно исправить):'); console.log('-'.repeat(70)); for (const p of problems) { console.log(` Beneficiary #${p.beneficiaryId} (${p.name}):`); console.log(` - WellNuo deployment_id: ${p.deploymentId}`); console.log(` - legacy_deployment_id: ${p.legacyId}`); console.log(` - Проблема: ${p.issue}`); console.log(); } } // 5. Дополнительно: проверим устройства для проблемных deployments if (problems.filter(p => p.legacyId !== null).length > 0) { console.log('6. ПРОВЕРКА УСТРОЙСТВ ДЛЯ НЕСУЩЕСТВУЮЩИХ DEPLOYMENTS:'); console.log('-'.repeat(70)); for (const p of problems.filter(p => p.legacyId !== null)) { const devicesResp = await legacyRequest({ function: 'device_list_by_deployment', deployment_id: String(p.legacyId), first: '0', last: '50' }); const deviceCount = devicesResp.result_list ? devicesResp.result_list.length : 0; console.log(` Legacy deployment ${p.legacyId}: ${deviceCount} устройств`); } } } catch (error) { console.error(' ОШИБКА БД:', error.message); } finally { await client.end(); } console.log(); console.log('='.repeat(70)); console.log('Проверка завершена'); } main().catch(console.error);