From 36c5990921c643796d829cdd1e33b0c37165503e Mon Sep 17 00:00:00 2001 From: Bivekich Date: Sat, 5 Jul 2025 13:35:49 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A3=D0=BB=D1=83=D1=87=D1=88=D0=B5=D0=BD?= =?UTF-8?q?=D0=B0=20=D0=BE=D0=B1=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BA=D0=B0?= =?UTF-8?q?=20SSD=20=D0=B2=20=D0=BA=D0=BE=D0=BC=D0=BF=D0=BE=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D1=82=D0=B0=D1=85=20QuickDetailSection,=20UnitDetailsSec?= =?UTF-8?q?tion=20=D0=B8=20KnotIn.=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D1=8B=20=D0=BE=D1=82=D0=BB=D0=B0=D0=B4=D0=BE=D1=87?= =?UTF-8?q?=D0=BD=D1=8B=D0=B5=20=D0=BB=D0=BE=D0=B3=D0=B8=20=D0=B4=D0=BB?= =?UTF-8?q?=D1=8F=20=D0=BE=D1=82=D1=81=D0=BB=D0=B5=D0=B6=D0=B8=D0=B2=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=20=D0=B7=D0=BD=D0=B0=D1=87=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B9=20SSD=20=D0=B8=20=D1=81=D0=BE=D1=81=D1=82=D0=BE=D1=8F?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=20=D0=B7=D0=B0=D0=B3=D1=80=D1=83=D0=B7=D0=BA?= =?UTF-8?q?=D0=B8=20=D0=B4=D0=B0=D0=BD=D0=BD=D1=8B=D1=85.=20=D0=9E=D0=B1?= =?UTF-8?q?=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5=D0=BD=D1=8B=20=D1=83=D1=81=D0=BB?= =?UTF-8?q?=D0=BE=D0=B2=D0=B8=D1=8F=20=D0=BF=D1=80=D0=BE=D0=BF=D1=83=D1=81?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=B7=D0=B0=D0=BF=D1=80=D0=BE=D1=81=D0=BE=D0=B2?= =?UTF-8?q?=20=D0=B2=20=D0=B7=D0=B0=D0=B2=D0=B8=D1=81=D0=B8=D0=BC=D0=BE?= =?UTF-8?q?=D1=81=D1=82=D0=B8=20=D0=BE=D1=82=20=D0=BD=D0=B0=D0=BB=D0=B8?= =?UTF-8?q?=D1=87=D0=B8=D1=8F=20SSD.=20=D0=98=D1=81=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=D0=B0=20=D0=BB=D0=BE=D0=B3=D0=B8=D0=BA?= =?UTF-8?q?=D0=B0=20=D0=BF=D0=B5=D1=80=D0=B5=D0=B4=D0=B0=D1=87=D0=B8=20SSD?= =?UTF-8?q?=20=D0=B2=20=D0=BA=D0=BE=D0=BC=D0=BF=D0=BE=D0=BD=D0=B5=D0=BD?= =?UTF-8?q?=D1=82=20KnotIn=20=D1=81=20=D0=B8=D1=81=D0=BF=D0=BE=D0=BB=D1=8C?= =?UTF-8?q?=D0=B7=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=D0=BC=20=D0=B7=D0=BD?= =?UTF-8?q?=D0=B0=D1=87=D0=B5=D0=BD=D0=B8=D1=8F=20=D1=83=D0=B7=D0=BB=D0=B0?= =?UTF-8?q?=20=D0=B8=D0=BB=D0=B8=20=D1=80=D0=BE=D0=B4=D0=B8=D1=82=D0=B5?= =?UTF-8?q?=D0=BB=D1=8C=D1=81=D0=BA=D0=BE=D0=B3=D0=BE=20SSD.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/QuickGroupsSection.tsx | 25 ++-- src/components/UnitDetailsSection.tsx | 17 +-- src/components/vin/KnotIn.tsx | 115 ++++++++++++++++-- src/components/vin/VinLeftbar.tsx | 26 +++- .../vehicle-search/[brand]/[vehicleId].tsx | 14 ++- 5 files changed, 168 insertions(+), 29 deletions(-) diff --git a/src/components/QuickGroupsSection.tsx b/src/components/QuickGroupsSection.tsx index fd14340..4bf4b41 100644 --- a/src/components/QuickGroupsSection.tsx +++ b/src/components/QuickGroupsSection.tsx @@ -156,10 +156,15 @@ const QuickDetailSection: React.FC = ({ }; const handleUnitClick = (unit: LaximoUnit) => { - setSelectedUnit({ - ...unit, - ssd: unit.ssd || ssd // Сохраняем правильный SSD в selectedUnit + // ИСПРАВЛЕНИЕ: Сохраняем SSD узла из API ответа + console.log('🔍 handleUnitClick - сохраняем узел с SSD:', { + unitId: unit.unitid, + unitName: unit.name, + unitSsd: unit.ssd ? `${unit.ssd.substring(0, 50)}...` : 'отсутствует', + unitSsdLength: unit.ssd?.length }); + + setSelectedUnit(unit); // Сохраняем полный объект узла с его SSD }; const handleBackFromUnit = () => { @@ -209,21 +214,23 @@ const QuickDetailSection: React.FC = ({ // Если выбран узел для детального просмотра, показываем UnitDetailsSection if (selectedUnit) { - const unitSsd = selectedUnit.ssd || ssd; + // ИСПРАВЛЕНИЕ: Используем SSD узла из API ответа, а не родительский SSD + // API Laximo возвращает для каждого узла свой собственный SSD console.log('🔍 QuickDetailSection передает в UnitDetailsSection:', { - unitSsd: unitSsd ? `${unitSsd.substring(0, 50)}...` : 'отсутствует', - unitSsdLength: unitSsd?.length, + parentSsd: ssd ? `${ssd.substring(0, 50)}...` : 'отсутствует', + parentSsdLength: ssd?.length, selectedUnitSsd: selectedUnit.ssd ? `${selectedUnit.ssd.substring(0, 50)}...` : 'отсутствует', - fallbackSsd: ssd ? `${ssd.substring(0, 50)}...` : 'отсутствует', + selectedUnitSsdLength: selectedUnit.ssd?.length, unitId: selectedUnit.unitid, - unitName: selectedUnit.name + unitName: selectedUnit.name, + note: 'Используем SSD УЗЛА из API ответа' }); return ( = ({ ssd: ssd ? `${ssd.substring(0, 50)}...` : 'отсутствует', ssdLength: ssd?.length, unitId, - unitName + unitName, + note: 'Используем SSD узла для API запросов' }); const { data: unitInfoData, loading: unitInfoLoading, error: unitInfoError } = useQuery<{ laximoUnitInfo: LaximoUnitInfo }>( @@ -52,11 +53,11 @@ const UnitDetailsSection: React.FC = ({ catalogCode, vehicleId, unitId, - ssd: ssd || '' + ssd }, - skip: !catalogCode || vehicleId === undefined || vehicleId === null || !unitId, + skip: !catalogCode || vehicleId === undefined || vehicleId === null || !unitId || !ssd || ssd.trim() === '', errorPolicy: 'all', - fetchPolicy: 'no-cache', // Отключаем кэширование для получения актуального SSD + fetchPolicy: 'no-cache', // Отключаем кэширование для получения актуальных данных notifyOnNetworkStatusChange: true } ); @@ -76,9 +77,9 @@ const UnitDetailsSection: React.FC = ({ catalogCode, vehicleId, unitId, - ssd: ssd || '' + ssd }, - skip: !catalogCode || vehicleId === undefined || vehicleId === null || !unitId, + skip: !catalogCode || vehicleId === undefined || vehicleId === null || !unitId || !ssd || ssd.trim() === '', errorPolicy: 'all', fetchPolicy: 'no-cache', // Отключаем кэширование для получения актуального SSD notifyOnNetworkStatusChange: true @@ -100,9 +101,9 @@ const UnitDetailsSection: React.FC = ({ catalogCode, vehicleId, unitId, - ssd: ssd || '' + ssd }, - skip: !catalogCode || vehicleId === undefined || vehicleId === null || !unitId, + skip: !catalogCode || vehicleId === undefined || vehicleId === null || !unitId || !ssd || ssd.trim() === '', errorPolicy: 'all', fetchPolicy: 'no-cache', // Отключаем кэширование для получения актуального SSD notifyOnNetworkStatusChange: true diff --git a/src/components/vin/KnotIn.tsx b/src/components/vin/KnotIn.tsx index bec0e16..024c819 100644 --- a/src/components/vin/KnotIn.tsx +++ b/src/components/vin/KnotIn.tsx @@ -43,30 +43,72 @@ const KnotIn: React.FC = ({ catalogCode, vehicleId, ssd, unitId, un const router = useRouter(); // Получаем инфо об узле (для картинки) + console.log('🔍 KnotIn - GET_LAXIMO_UNIT_INFO запрос:', { + catalogCode, + vehicleId, + unitId, + ssd: ssd ? `${ssd.substring(0, 50)}...` : 'отсутствует', + ssdLength: ssd?.length, + skipCondition: !catalogCode || !vehicleId || !unitId || !ssd || ssd.trim() === '' + }); + const { data: unitInfoData, loading: unitInfoLoading, error: unitInfoError } = useQuery( GET_LAXIMO_UNIT_INFO, { - variables: { catalogCode: catalogCode || '', vehicleId: vehicleId || '', unitId: unitId || '', ssd: ssd || '' }, - skip: !catalogCode || !vehicleId || !unitId, + variables: { + catalogCode, + vehicleId, + unitId, + ssd + }, + skip: !catalogCode || !vehicleId || !unitId || !ssd || ssd.trim() === '', errorPolicy: 'all', } ); + // Получаем карту координат + console.log('🔍 KnotIn - GET_LAXIMO_UNIT_IMAGE_MAP запрос:', { + catalogCode, + vehicleId, + unitId, + ssd: ssd ? `${ssd.substring(0, 50)}...` : 'отсутствует', + ssdLength: ssd?.length, + skipCondition: !catalogCode || !vehicleId || !unitId || !ssd || ssd.trim() === '' + }); + const { data: imageMapData, loading: imageMapLoading, error: imageMapError } = useQuery( GET_LAXIMO_UNIT_IMAGE_MAP, { - variables: { catalogCode: catalogCode || '', vehicleId: vehicleId || '', unitId: unitId || '', ssd: ssd || '' }, - skip: !catalogCode || !vehicleId || !unitId, + variables: { + catalogCode, + vehicleId, + unitId, + ssd + }, + skip: !catalogCode || !vehicleId || !unitId || !ssd || ssd.trim() === '', errorPolicy: 'all', } ); // Если нет необходимых данных, показываем заглушку - if (!catalogCode || !vehicleId || !unitId) { + if (!catalogCode || !vehicleId || !unitId || !ssd || ssd.trim() === '') { + console.log('⚠️ KnotIn: отсутствуют необходимые данные:', { + catalogCode: !!catalogCode, + vehicleId: !!vehicleId, + unitId: !!unitId, + ssd: !!ssd, + ssdValid: ssd ? ssd.trim() !== '' : false + }); + return (
Схема узла
Выберите узел для отображения схемы
+ {process.env.NODE_ENV === 'development' && ( +
+ Debug: catalogCode={catalogCode}, vehicleId={vehicleId}, unitId={unitId}, ssd={ssd ? 'есть' : 'нет'} +
+ )}
); } @@ -75,6 +117,29 @@ const KnotIn: React.FC = ({ catalogCode, vehicleId, ssd, unitId, un const coordinates = imageMapData?.laximoUnitImageMap?.coordinates || []; const imageUrl = unitInfo?.imageurl ? getImageUrl(unitInfo.imageurl, selectedImageSize) : ''; + // Логируем успешную загрузку данных + React.useEffect(() => { + if (unitInfo) { + console.log('✅ KnotIn: данные узла загружены:', { + unitName: unitInfo.name, + hasImage: !!unitInfo.imageurl, + imageUrl: unitInfo.imageurl, + processedImageUrl: imageUrl + }); + } + }, [unitInfo, imageUrl]); + + React.useEffect(() => { + if (coordinates.length > 0) { + console.log('✅ KnotIn: координаты карты загружены:', { + coordinatesCount: coordinates.length, + firstCoordinate: coordinates[0] + }); + } else if (imageMapData) { + console.log('⚠️ KnotIn: карта изображений загружена, но координаты пустые:', imageMapData); + } + }, [coordinates, imageMapData]); + // Масштабируем точки после загрузки картинки const handleImageLoad = (e: React.SyntheticEvent) => { const img = e.currentTarget; @@ -110,13 +175,49 @@ const KnotIn: React.FC = ({ catalogCode, vehicleId, ssd, unitId, un }, [parts, coordinates]); if (unitInfoLoading || imageMapLoading) { + console.log('🔄 KnotIn: загрузка данных...', { + unitInfoLoading, + imageMapLoading, + unitInfoError: unitInfoError?.message, + imageMapError: imageMapError?.message + }); return
Загружаем схему узла...
; } + if (unitInfoError) { - return
Ошибка загрузки схемы: {unitInfoError.message}
; + console.error('❌ KnotIn: ошибка загрузки информации об узле:', unitInfoError); + return ( +
+ Ошибка загрузки схемы: {unitInfoError.message} + {process.env.NODE_ENV === 'development' && ( +
+ GraphQL Error: {JSON.stringify(unitInfoError, null, 2)} +
+ )} +
+ ); } + + if (imageMapError) { + console.error('❌ KnotIn: ошибка загрузки карты изображений:', imageMapError); + } + if (!imageUrl) { - return
Нет изображения для этого узла
; + console.log('⚠️ KnotIn: нет URL изображения:', { + unitInfo: !!unitInfo, + imageurl: unitInfo?.imageurl, + unitInfoData: !!unitInfoData + }); + return ( +
+ Нет изображения для этого узла + {process.env.NODE_ENV === 'development' && unitInfo && ( +
+ Debug: unitInfo.imageurl = {unitInfo.imageurl || 'отсутствует'} +
+ )} +
+ ); } return ( diff --git a/src/components/vin/VinLeftbar.tsx b/src/components/vin/VinLeftbar.tsx index 5b6c0a3..80703a4 100644 --- a/src/components/vin/VinLeftbar.tsx +++ b/src/components/vin/VinLeftbar.tsx @@ -327,7 +327,12 @@ const VinLeftbar: React.FC = ({ vehicleInfo, onSearchResults, o className="dropdown-link-3 w-dropdown-link" onClick={(e) => { e.preventDefault(); - handleQuickGroupToggle(group.quickgroupid, 0); + // Если это конечная группа с link=true, открываем QuickGroup + if (group.link && onQuickGroupSelect) { + onQuickGroupSelect(group); + } else { + handleQuickGroupToggle(group.quickgroupid, 0); + } }} > {group.name} @@ -366,7 +371,12 @@ const VinLeftbar: React.FC = ({ vehicleInfo, onSearchResults, o className="dropdown-link-3 w-dropdown-link" onClick={(e) => { e.preventDefault(); - handleQuickGroupToggle(child.quickgroupid, 1); + // Если это конечная группа с link=true, открываем QuickGroup + if (child.link && onQuickGroupSelect) { + onQuickGroupSelect(child); + } else { + handleQuickGroupToggle(child.quickgroupid, 1); + } }} > {child.name} @@ -400,7 +410,12 @@ const VinLeftbar: React.FC = ({ vehicleInfo, onSearchResults, o className="dropdown-link-3 w-dropdown-link" onClick={(e) => { e.preventDefault(); - handleQuickGroupToggle(subChild.quickgroupid, 3); + // Если это конечная группа с link=true, открываем QuickGroup + if (subChild.link && onQuickGroupSelect) { + onQuickGroupSelect(subChild); + } else { + handleQuickGroupToggle(subChild.quickgroupid, 3); + } }} > {subChild.name} @@ -458,7 +473,10 @@ const VinLeftbar: React.FC = ({ vehicleInfo, onSearchResults, o className="dropdown-link-3 w-dropdown-link pl-0" onClick={e => { e.preventDefault(); - if (onNodeSelect) { + // Если это конечная категория с link=true, открываем QuickGroup + if (subcat.link && onQuickGroupSelect) { + onQuickGroupSelect(subcat); + } else if (onNodeSelect) { onNodeSelect({ ...subcat, unitid: subcat.unitid || subcat.quickgroupid || subcat.id diff --git a/src/pages/vehicle-search/[brand]/[vehicleId].tsx b/src/pages/vehicle-search/[brand]/[vehicleId].tsx index b8f967c..51b5757 100644 --- a/src/pages/vehicle-search/[brand]/[vehicleId].tsx +++ b/src/pages/vehicle-search/[brand]/[vehicleId].tsx @@ -414,10 +414,22 @@ const VehicleDetailsPage = () => {
{/* */} + {/* ОТЛАДКА: Логируем передачу SSD в KnotIn */} + {(() => { + const knotSsd = selectedNode.ssd || vehicleInfo.ssd; + console.log('🔍 [vehicleId].tsx передает в KnotIn:', { + selectedNodeSsd: selectedNode.ssd ? `${selectedNode.ssd.substring(0, 50)}...` : 'отсутствует', + vehicleInfoSsd: vehicleInfo.ssd ? `${vehicleInfo.ssd.substring(0, 50)}...` : 'отсутствует', + finalSsd: knotSsd ? `${knotSsd.substring(0, 50)}...` : 'отсутствует', + unitId: selectedNode.unitid, + unitName: selectedNode.name + }); + return null; + })()}