Исправление GraphQL ошибок: удаление несуществующих полей из запросов Laximo

- Удалены несуществующие поля doors, frame, frames, framefrom, frameto, engine1, engine2, attributes
- Обновлены GraphQL запросы для соответствия схеме
- Обновлены TypeScript типы LaximoVehicleSearchResult
- Сохранены улучшения UI из удаленного репозитория
- Исправлены ApolloError при поиске автомобилей
This commit is contained in:
Bivekich
2025-07-02 16:36:27 +03:00
parent cfddecd686
commit f71672dfa8
3 changed files with 141 additions and 88 deletions

View File

@ -47,96 +47,119 @@ const VehicleSearchResults: React.FC<VehicleSearchResultsProps> = ({
} }
}; };
// Функция для условного отображения атрибута
const renderAttribute = (label: string, value: string | undefined) => {
if (!value || value === '' || value === 'undefined') return null
return (
<div className="flex justify-between py-1 border-b border-gray-100">
<span className="text-sm text-gray-600 font-medium">{label}:</span>
<span className="text-sm text-gray-900">{value}</span>
</div>
)
}
if (results.length === 0) { if (results.length === 0) {
return null; return null;
} }
return ( return (
<div className="bg-white rounded-2xl md:my-8"> <div className="space-y-4">
<div className="mb-2"> <h3 className="text-lg font-semibold text-gray-900">
<h4 className="text-lg font-medium text-gray-900"> Найдено автомобилей: {results.length}
Найденные автомобили ({results.length}) </h3>
</h4>
</div>
<div className="flex flex-col gap-4"> <div className="grid gap-4 md:grid-cols-2 lg:grid-cols-3">
{results.map((vehicle, index) => ( {results.map((vehicle, index) => (
<div <div
key={vehicle.vehicleid || index} key={`${vehicle.vehicleid}-${index}`}
className="pt-3 pb-3 px-5 bg-white border-b border-gray-200 hover:bg-neutral-50 transition-colors cursor-pointer flex flex-col sm:flex-row sm:items-center gap-4" className="bg-white rounded-lg shadow-md border border-gray-200 p-4 hover:shadow-lg transition-shadow cursor-pointer"
onClick={() => handleSelectVehicle(vehicle)} onClick={() => handleSelectVehicle(vehicle)}
> >
<div className="flex-1 min-w-0"> {/* Заголовок автомобиля */}
<div className="flex flex-wrap items-center gap-3 mb-2"> <div className="mb-3">
<h4 className="text-lg font-semibold text-gray-900 truncate"> <h4 className="text-lg font-semibold text-blue-600 mb-1">
{vehicle.name || `${vehicle.brand || 'Unknown'} ${vehicle.model || 'Vehicle'}`} {vehicle.name || `${vehicle.brand} ${vehicle.model}`}
</h4> </h4>
{vehicle.year && ( <p className="text-sm text-gray-500">
<span className="inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium bg-red-50 text-red-700"> {vehicle.modification} ({vehicle.year})
{vehicle.year}
</span>
)}
</div>
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4 text-sm mb-2">
{vehicle.modification && (
<div>
<span className="text-gray-500">Модификация:</span>
<span className="ml-2 font-medium text-gray-900">{vehicle.modification}</span>
</div>
)}
{vehicle.bodytype && (
<div>
<span className="text-gray-500">Тип кузова:</span>
<span className="ml-2 font-medium text-gray-900">{vehicle.bodytype}</span>
</div>
)}
{vehicle.engine && (
<div>
<span className="text-gray-500">Двигатель:</span>
<span className="ml-2 font-medium text-gray-900">{vehicle.engine}</span>
</div>
)}
</div>
{vehicle.notes && (
<div className="mt-3 p-3 bg-blue-50 rounded-lg">
<div className="flex">
<div className="flex-shrink-0">
<svg className="h-5 w-5 text-blue-400" viewBox="0 0 20 20" fill="currentColor">
<path fillRule="evenodd" d="M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z" clipRule="evenodd" />
</svg>
</div>
<div className="ml-3">
<p className="text-sm text-blue-800">
<span className="font-medium">Примечание:</span> {vehicle.notes}
</p> </p>
</div> </div>
{/* Основные характеристики */}
<div className="space-y-1 mb-4">
<h5 className="text-sm font-semibold text-gray-700 mb-2">Основные характеристики</h5>
{renderAttribute('Марка', vehicle.brand)}
{renderAttribute('Модель', vehicle.model)}
{renderAttribute('Год', vehicle.year)}
{renderAttribute('Кузов', vehicle.bodytype)}
{renderAttribute('Двигатель', vehicle.engine)}
{renderAttribute('Трансмиссия', vehicle.transmission)}
</div> </div>
{/* Дополнительные характеристики */}
<div className="space-y-1 mb-4">
<h5 className="text-sm font-semibold text-gray-700 mb-2">Дополнительные характеристики</h5>
{renderAttribute('Класс', vehicle.grade)}
{renderAttribute('Цвет кузова', vehicle.framecolor)}
{renderAttribute('Цвет салона', vehicle.trimcolor)}
{renderAttribute('Рынок', vehicle.market)}
{renderAttribute('Регион производства', vehicle.creationregion)}
{renderAttribute('Регион назначения', vehicle.destinationregion)}
</div>
{/* Технические характеристики */}
<div className="space-y-1 mb-4">
<h5 className="text-sm font-semibold text-gray-700 mb-2">Технические характеристики</h5>
{renderAttribute('Информация о двигателе', vehicle.engine_info)}
{renderAttribute('Номер двигателя', vehicle.engineno)}
{renderAttribute('Дата производства', vehicle.date)}
{renderAttribute('Произведен', vehicle.manufactured)}
{renderAttribute('Период производства', vehicle.prodPeriod)}
{renderAttribute('Диапазон производства', vehicle.prodRange)}
</div>
{/* Даты и периоды */}
<div className="space-y-1 mb-4">
<h5 className="text-sm font-semibold text-gray-700 mb-2">Даты и периоды</h5>
{renderAttribute('Дата с', vehicle.datefrom)}
{renderAttribute('Дата по', vehicle.dateto)}
{renderAttribute('Модельный год с', vehicle.modelyearfrom)}
{renderAttribute('Модельный год по', vehicle.modelyearto)}
</div>
{/* Опции и описание */}
{(vehicle.options || vehicle.description || vehicle.notes) && (
<div className="space-y-1 mb-4">
<h5 className="text-sm font-semibold text-gray-700 mb-2">Опции и описание</h5>
{renderAttribute('Опции', vehicle.options)}
{renderAttribute('Описание', vehicle.description)}
{renderAttribute('Примечания', vehicle.notes)}
</div>
)}
{/* Системная информация */}
<div className="mt-4 pt-3 border-t border-gray-200">
<div className="text-xs text-gray-400 space-y-1">
<div>ID: {vehicle.vehicleid}</div>
{vehicle.catalog && <div>Каталог: {vehicle.catalog}</div>}
{vehicle.ssd && (
<div>SSD: {vehicle.ssd.length > 50 ? `${vehicle.ssd.substring(0, 50)}...` : vehicle.ssd}</div>
)}
</div>
</div>
{/* Debug информация (только в development) */}
{process.env.NODE_ENV === 'development' && (
<div className="mt-4 p-2 bg-gray-100 rounded text-xs">
<div className="font-semibold text-gray-700 mb-1">Debug Info:</div>
<pre className="text-gray-600 whitespace-pre-wrap">
{JSON.stringify(vehicle, null, 2)}
</pre>
</div> </div>
)} )}
</div> </div>
<div className="flex-shrink-0 flex items-center justify-end">
<button
onClick={e => {
e.stopPropagation();
handleSelectVehicle(vehicle);
}}
className="inline-flex items-center px-6 py-3 border border-transparent text-base font-medium rounded-lg bg-red-600 hover:bg-red-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-red-500 shadow transition"
style={{ color: '#fff' }}
>
Выбрать
</button>
</div>
</div>
))} ))}
</div> </div>
<div className="bg-gray-50 rounded-xl pt-4 pb-4 mt-6 flex flex-col sm:flex-row items-center justify-between text-sm text-gray-600">
<span>Показано {results.length} результат{results.length === 1 ? '' : results.length < 5 ? 'а' : 'ов'}</span>
<span>Кликните на автомобиль для подбора запчастей</span>
</div>
</div> </div>
); );
}; };

View File

@ -540,7 +540,9 @@ export const FIND_LAXIMO_VEHICLE_BY_WIZARD = gql`
query FindLaximoVehicleByWizard($catalogCode: String!, $ssd: String!) { query FindLaximoVehicleByWizard($catalogCode: String!, $ssd: String!) {
laximoFindVehicleByWizard(catalogCode: $catalogCode, ssd: $ssd) { laximoFindVehicleByWizard(catalogCode: $catalogCode, ssd: $ssd) {
vehicleid vehicleid
name
brand brand
catalog
model model
modification modification
year year
@ -548,12 +550,29 @@ export const FIND_LAXIMO_VEHICLE_BY_WIZARD = gql`
engine engine
notes notes
ssd ssd
transmission
date
manufactured
framecolor
trimcolor
engine_info
engineno
market
prodRange
prodPeriod
destinationregion
creationregion
datefrom
dateto
modelyearfrom
modelyearto
options
description
grade
} }
} }
`; `;
export const FIND_LAXIMO_VEHICLE_BY_PLATE = gql` export const FIND_LAXIMO_VEHICLE_BY_PLATE = gql`
query FindLaximoVehicleByPlate($catalogCode: String!, $plateNumber: String!) { query FindLaximoVehicleByPlate($catalogCode: String!, $plateNumber: String!) {
laximoFindVehicleByPlate(catalogCode: $catalogCode, plateNumber: $plateNumber) { laximoFindVehicleByPlate(catalogCode: $catalogCode, plateNumber: $plateNumber) {
@ -628,8 +647,6 @@ export const FIND_LAXIMO_VEHICLE_BY_PLATE_GLOBAL = gql`
} }
`; `;
export const FIND_LAXIMO_PART_REFERENCES = gql` export const FIND_LAXIMO_PART_REFERENCES = gql`
query FindLaximoPartReferences($partNumber: String!) { query FindLaximoPartReferences($partNumber: String!) {
laximoFindPartReferences(partNumber: $partNumber) laximoFindPartReferences(partNumber: $partNumber)
@ -695,6 +712,25 @@ export const FIND_LAXIMO_VEHICLES_BY_PART_NUMBER = gql`
engine engine
notes notes
ssd ssd
transmission
date
manufactured
framecolor
trimcolor
engine_info
engineno
market
prodRange
prodPeriod
destinationregion
creationregion
datefrom
dateto
modelyearfrom
modelyearto
options
description
grade
} }
} }
} }

View File

@ -88,7 +88,6 @@ export interface LaximoVehicleSearchResult {
// Дополнительные атрибуты из документации Laximo // Дополнительные атрибуты из документации Laximo
grade?: string grade?: string
transmission?: string transmission?: string
doors?: string
creationregion?: string creationregion?: string
destinationregion?: string destinationregion?: string
date?: string date?: string
@ -97,12 +96,6 @@ export interface LaximoVehicleSearchResult {
trimcolor?: string trimcolor?: string
datefrom?: string datefrom?: string
dateto?: string dateto?: string
frame?: string
frames?: string
framefrom?: string
frameto?: string
engine1?: string
engine2?: string
engine_info?: string engine_info?: string
engineno?: string engineno?: string
options?: string options?: string
@ -112,8 +105,9 @@ export interface LaximoVehicleSearchResult {
market?: string market?: string
prodRange?: string prodRange?: string
prodPeriod?: string prodPeriod?: string
carpet_color?: string
seat_combination_code?: string // Дополнительные атрибуты (могут приходить в виде массива attributes)
sales_code?: string
} }
export interface LaximoVehicleInfo { export interface LaximoVehicleInfo {