Import Vector lab project
This commit is contained in:
@@ -0,0 +1,268 @@
|
||||
import React from 'react';
|
||||
import './BehavioralProfile.css';
|
||||
|
||||
interface BehavioralProfileProps {
|
||||
diagnosis_type?: string[];
|
||||
has_transport?: string;
|
||||
age_years?: number;
|
||||
reason?: string;
|
||||
}
|
||||
|
||||
interface ProfileCardData {
|
||||
id: string;
|
||||
title: string;
|
||||
color: string;
|
||||
recommendations: string[];
|
||||
zoneModifiers: { zone: string; multiplier: number }[];
|
||||
}
|
||||
|
||||
const BehavioralProfile: React.FC<BehavioralProfileProps> = ({
|
||||
diagnosis_type = [],
|
||||
has_transport,
|
||||
age_years,
|
||||
reason
|
||||
}) => {
|
||||
const getActiveProfiles = (): ProfileCardData[] => {
|
||||
const profiles: ProfileCardData[] = [];
|
||||
|
||||
// РАС (Расстройство аутистического спектра)
|
||||
if (diagnosis_type.includes('РАС') || diagnosis_type.includes('аутизм')) {
|
||||
profiles.push({
|
||||
id: 'ras',
|
||||
title: 'РАС (Расстройство аутистического спектра)',
|
||||
color: 'red',
|
||||
recommendations: [
|
||||
'Не кричать имя — может спрятаться от громких звуков',
|
||||
'Приоритет: водоёмы, тихие места, укрытия',
|
||||
'Перекрыть доступ к воде (пруды, реки, колодцы)',
|
||||
'Проверить железнодорожные пути и технические помещения',
|
||||
'Искать в радиусе до 5 км, часто движется по прямой'
|
||||
],
|
||||
zoneModifiers: [
|
||||
{ zone: 'Водоём', multiplier: 3.0 },
|
||||
{ zone: 'Укрытие', multiplier: 2.0 },
|
||||
{ zone: 'Населённый пункт', multiplier: 0.4 }
|
||||
]
|
||||
});
|
||||
}
|
||||
|
||||
// Эпилепсия
|
||||
if (diagnosis_type.includes('эпилепсия')) {
|
||||
profiles.push({
|
||||
id: 'epilepsy',
|
||||
title: 'Эпилепсия',
|
||||
color: 'orange',
|
||||
recommendations: [
|
||||
'Искать близко к точке потери — радиус до 1 км',
|
||||
'Проверить канавы, овраги, низины (риск падения)',
|
||||
'Приоритет: водоёмы и опасные участки',
|
||||
'Срочная медицинская помощь при обнаружении',
|
||||
'Проверить укрытия (мог укрыться после приступа)'
|
||||
],
|
||||
zoneModifiers: [
|
||||
{ zone: 'Водоём', multiplier: 3.5 },
|
||||
{ zone: 'Укрытие', multiplier: 2.5 },
|
||||
{ zone: 'Радиус поиска', multiplier: 0.6 }
|
||||
]
|
||||
});
|
||||
}
|
||||
|
||||
// СДВГ (Синдром дефицита внимания и гиперактивности)
|
||||
if (diagnosis_type.includes('СДВГ') || diagnosis_type.includes('гиперактивность')) {
|
||||
profiles.push({
|
||||
id: 'adhd',
|
||||
title: 'СДВГ (Гиперактивность)',
|
||||
color: 'yellow',
|
||||
recommendations: [
|
||||
'Расширенный радиус поиска — может уйти далеко',
|
||||
'Приоритет: дороги, тропы, интересные объекты',
|
||||
'Проверить игровые площадки, стройки, заброшенные здания',
|
||||
'Может отвлечься и изменить направление',
|
||||
'Искать вдоль дорог и троп'
|
||||
],
|
||||
zoneModifiers: [
|
||||
{ zone: 'Дороги', multiplier: 1.6 },
|
||||
{ zone: 'Радиус поиска', multiplier: 1.4 }
|
||||
]
|
||||
});
|
||||
}
|
||||
|
||||
// Деменция
|
||||
if (diagnosis_type.includes('деменция') || diagnosis_type.includes('Альцгеймер')) {
|
||||
profiles.push({
|
||||
id: 'dementia',
|
||||
title: 'Деменция / Альцгеймер',
|
||||
color: 'purple',
|
||||
recommendations: [
|
||||
'Искать в радиусе до 2 км от дома',
|
||||
'Проверить знакомые места (бывший дом, работа)',
|
||||
'Приоритет: дороги, тропы (идёт по привычному маршруту)',
|
||||
'Может не откликаться на имя',
|
||||
'Проверить водоёмы и опасные участки'
|
||||
],
|
||||
zoneModifiers: [
|
||||
{ zone: 'Дороги', multiplier: 1.8 },
|
||||
{ zone: 'Исторические места', multiplier: 2.0 },
|
||||
{ zone: 'Водоём', multiplier: 1.5 }
|
||||
]
|
||||
});
|
||||
}
|
||||
|
||||
// Велосипед
|
||||
if (has_transport === 'велосипед') {
|
||||
profiles.push({
|
||||
id: 'bicycle',
|
||||
title: 'Транспорт: Велосипед',
|
||||
color: 'blue',
|
||||
recommendations: [
|
||||
'Радиус поиска ×5 — может уехать на 10-25 км',
|
||||
'Приоритет: дороги, велодорожки, тропы',
|
||||
'Запросить записи с камер на дорогах',
|
||||
'Проверить популярные велосипедные маршруты',
|
||||
'Лес и бездорожье менее вероятны'
|
||||
],
|
||||
zoneModifiers: [
|
||||
{ zone: 'Радиус поиска', multiplier: 5.0 },
|
||||
{ zone: 'Дороги', multiplier: 1.8 },
|
||||
{ zone: 'Лес', multiplier: 0.8 }
|
||||
]
|
||||
});
|
||||
}
|
||||
|
||||
// Автомобиль
|
||||
if (has_transport === 'автомобиль' || has_transport === 'машина') {
|
||||
profiles.push({
|
||||
id: 'car',
|
||||
title: 'Транспорт: Автомобиль',
|
||||
color: 'blue',
|
||||
recommendations: [
|
||||
'Радиус поиска ×10 — может уехать на 50+ км',
|
||||
'Запросить записи с камер ГИБДД и дорожных камер',
|
||||
'Проверить заправки, парковки, придорожные кафе',
|
||||
'Ориентация на дороги и трассы',
|
||||
'Розыск по номеру автомобиля'
|
||||
],
|
||||
zoneModifiers: [
|
||||
{ zone: 'Радиус поиска', multiplier: 10.0 },
|
||||
{ zone: 'Дороги', multiplier: 2.5 },
|
||||
{ zone: 'Лес', multiplier: 0.3 }
|
||||
]
|
||||
});
|
||||
}
|
||||
|
||||
// Подросток, ушедший из дома
|
||||
if (age_years && age_years >= 13 && age_years <= 17 &&
|
||||
(reason?.includes('ушёл из дома') || reason?.includes('конфликт'))) {
|
||||
profiles.push({
|
||||
id: 'runaway',
|
||||
title: 'Подросток: Уход из дома',
|
||||
color: 'gray',
|
||||
recommendations: [
|
||||
'Розыск через соцсети и друзей',
|
||||
'Проверить дома друзей, торговые центры, вокзалы',
|
||||
'Лес и удалённые места менее вероятны',
|
||||
'Может иметь телефон — запросить геолокацию',
|
||||
'Проверить популярные места встреч подростков'
|
||||
],
|
||||
zoneModifiers: [
|
||||
{ zone: 'Населённый пункт', multiplier: 2.0 },
|
||||
{ zone: 'Лес', multiplier: 0.3 },
|
||||
{ zone: 'Дороги', multiplier: 1.5 }
|
||||
]
|
||||
});
|
||||
}
|
||||
|
||||
// Грибник
|
||||
if (reason?.includes('грибы') || reason?.includes('грибник')) {
|
||||
profiles.push({
|
||||
id: 'mushroom',
|
||||
title: 'Активность: Сбор грибов',
|
||||
color: 'green',
|
||||
recommendations: [
|
||||
'Приоритет: лесные массивы, особенно смешанные леса',
|
||||
'Радиус до 3 км от точки входа в лес',
|
||||
'Проверить популярные грибные места',
|
||||
'Может углубиться в лес, потеряв ориентацию',
|
||||
'Искать вдоль просек и лесных дорог'
|
||||
],
|
||||
zoneModifiers: [
|
||||
{ zone: 'Лес', multiplier: 3.0 },
|
||||
{ zone: 'Дороги', multiplier: 0.6 },
|
||||
{ zone: 'Радиус поиска', multiplier: 1.2 }
|
||||
]
|
||||
});
|
||||
}
|
||||
|
||||
// Охотник
|
||||
if (reason?.includes('охота') || reason?.includes('охотник')) {
|
||||
profiles.push({
|
||||
id: 'hunter',
|
||||
title: 'Активность: Охота',
|
||||
color: 'green',
|
||||
recommendations: [
|
||||
'Радиус до 5-10 км — охотники перемещаются активно',
|
||||
'Приоритет: лесные массивы, поля, болота',
|
||||
'Проверить охотничьи вышки, избушки, кормушки',
|
||||
'Может иметь оружие — соблюдать осторожность',
|
||||
'Искать вдоль звериных троп и просек'
|
||||
],
|
||||
zoneModifiers: [
|
||||
{ zone: 'Лес', multiplier: 2.5 },
|
||||
{ zone: 'Радиус поиска', multiplier: 2.0 },
|
||||
{ zone: 'Укрытие', multiplier: 1.5 }
|
||||
]
|
||||
});
|
||||
}
|
||||
|
||||
return profiles;
|
||||
};
|
||||
|
||||
const activeProfiles = getActiveProfiles();
|
||||
|
||||
if (activeProfiles.length === 0) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return (
|
||||
<div className="behavioral-profiles">
|
||||
<h3 className="profiles-title">Поведенческие профили</h3>
|
||||
<div className="profiles-grid">
|
||||
{activeProfiles.map((profile) => (
|
||||
<div
|
||||
key={profile.id}
|
||||
className={`profile-card profile-card-${profile.color}`}
|
||||
>
|
||||
<div className="profile-header">
|
||||
<h4 className="profile-title">{profile.title}</h4>
|
||||
</div>
|
||||
|
||||
<div className="profile-recommendations">
|
||||
<h5>Рекомендации:</h5>
|
||||
<ul className="recommendations-list">
|
||||
{profile.recommendations.map((rec, idx) => (
|
||||
<li key={idx} className={idx >= 2 ? 'mobile-hidden' : ''}>
|
||||
{rec}
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div className="profile-modifiers">
|
||||
<h5>Модификаторы зон:</h5>
|
||||
<div className="modifiers-list">
|
||||
{profile.zoneModifiers.map((mod, idx) => (
|
||||
<div key={idx} className="modifier-item">
|
||||
<span className="modifier-zone">{mod.zone}:</span>
|
||||
<span className="modifier-value">×{mod.multiplier.toFixed(1)}</span>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default BehavioralProfile;
|
||||
Reference in New Issue
Block a user