import React, { useEffect, useMemo, useState } from 'react'; import { backendApi } from '../../services/apiClient'; import { Building, Employee } from '../../types'; import { AlertTriangle, Check, Loader2, RefreshCw } from 'lucide-react'; type PendingItem = { id: number; domaValue: string; suggestedId?: string | null; suggestedName?: string | null; createdAt: string; }; type PendingResponse = { success: boolean; data: { buildings: PendingItem[]; employees: PendingItem[]; }; }; interface DomaPendingMappingsProps { onClose?: () => void; } export const DomaPendingMappings: React.FC = ({ onClose }) => { const [pending, setPending] = useState(null); const [buildings, setBuildings] = useState([]); const [employees, setEmployees] = useState([]); const [loading, setLoading] = useState(true); const [resolvingId, setResolvingId] = useState(null); const [error, setError] = useState(null); const loadData = async () => { setLoading(true); setError(null); try { const [pendingRes, buildingsRes, employeesRes] = await Promise.all([ backendApi.getDomaPendingMappings(), backendApi.getBuildings(), backendApi.getEmployees(), ]); if (!pendingRes.success) { throw new Error('Ошибка при загрузке ожидающих сопоставлений'); } setPending(pendingRes.data); setBuildings(buildingsRes); setEmployees(employeesRes); } catch (e: any) { console.error('[DomaPendingMappings] Ошибка загрузки данных:', e); setError(e?.message || 'Ошибка загрузки данных'); } finally { setLoading(false); } }; useEffect(() => { loadData(); }, []); const buildingOptions = useMemo( () => buildings.map((b) => ({ id: b.id, label: b.passport?.address || 'Без адреса', })), [buildings] ); const employeeOptions = useMemo( () => employees.map((e) => ({ id: e.id, label: e.name, })), [employees] ); const handleResolve = async (item: PendingItem, type: 'building' | 'employee', targetId: string) => { if (!targetId) return; try { setResolvingId(item.id); await backendApi.resolveDomaPendingMapping(item.id, targetId); window.dispatchEvent(new CustomEvent('mkd-applications-changed')); await loadData(); } catch (e: any) { console.error('[DomaPendingMappings] Ошибка при сопоставлении:', e); setError(e?.message || 'Ошибка при сопоставлении'); } finally { setResolvingId(null); } }; const hasData = pending && (pending.buildings.length > 0 || pending.employees.length > 0); return (

Ожидающие сопоставления из Doma AI

Здесь вы вручную связываете адреса и исполнителей из Doma AI с домами и сотрудниками вашей базы. После этого синхронизация будет «чистой».

{onClose && ( )}
{loading && (
Загрузка ожидающих сопоставлений...
)} {!loading && error && (
{error}
)} {!loading && !error && !hasData && (

Нет ожидающих сопоставлений

Все адреса и исполнители из Doma AI уже сопоставлены с вашей базой.

)} {!loading && !error && hasData && pending && (
{pending.buildings.length > 0 && (

Адреса домов

{pending.buildings.map((item) => (

{item.domaValue}

из Doma AI • {new Date(item.createdAt).toLocaleString()}

{resolvingId === item.id && ( )}
))}
)} {pending.employees.length > 0 && (

Исполнители (сотрудники)

{pending.employees.map((item) => (

{item.domaValue}

из Doma AI • {new Date(item.createdAt).toLocaleString()}

{resolvingId === item.id && ( )}
))}
)}

После сопоставления значение будет сохранено и в следующих синхронизациях дом/сотрудник будут подставляться автоматически.

)}
); };