Вы абсолютно правы! Давайте всё исправим. Вот полный исправленный код:
## 1. ИСПРАВЛЯЕМ ОТОБРАЖЕНИЕ КАТЕГОРИЙ БУРЕНИЯ - используем данные из geo.intervals:
```javascript
// В функции drawWellStructure, при создании drillCell:
const drillCell = document.createElement('div');
drillCell.style.cssText = `
position: absolute;
top: ${topY}px;
left: 0;
width: 100%;
height: ${heightY}px;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
border-bottom: 1px solid #e2e8f0;
background: #f8fafc;
font-size: 0.7rem;
line-height: 1.4;
text-align: center;
cursor: pointer;
`;
// Берем категории из каждого интервала в группе
let categoriesHtml = '';
if (geo.intervals && geo.intervals.length > 0) {
const allCategories = [];
geo.intervals.forEach(interval => {
if (interval.rockCategories && interval.rockCategories !== 'Не указано' && interval.rockCategories !== '') {
const cats = interval.rockCategories.split('; ');
cats.forEach(cat => {
const match = cat.match(/([\d.-]+)-([\d.-]+)\s*-\s*(.+)/);
if (match) {
allCategories.push({
from: parseFloat(match[1]),
to: parseFloat(match[2]),
category: match[3]
});
}
});
}
});
// Сортируем по глубине и объединяем
allCategories.sort((a, b) => a.from - b.from);
const uniqueCategories = [];
allCategories.forEach(cat => {
if (!uniqueCategories.find(c => c.category === cat.category && Math.abs(c.from - cat.from) < 0.1)) {
uniqueCategories.push(cat);
}
});
if (uniqueCategories.length > 0) {
categoriesHtml = uniqueCategories.map(cat =>
`
${cat.from.toFixed(1)}-${cat.to.toFixed(1)}м
${cat.category}
`
).join('');
}
}
if (!categoriesHtml) {
categoriesHtml = '—';
}
drillCell.innerHTML = categoriesHtml;
```
## 2. ИСПРАВЛЯЕМ ЦВЕТ ПОЛОСКИ В КАРТОЧКАХ - сохраняем цвет при нажатии:
```javascript
function createGeologyCard(group, index) {
const card = document.createElement('div');
card.className = 'geology-card';
card.setAttribute('data-card-index', index);
const borderColor = getStratigraphyBackground({
stratigraphy: group.stratigraphy,
originalStratigraphy: group.originalStratigraphy
});
card.style.cssText = `
padding: 12px;
margin-bottom: 10px;
background: white;
border-radius: 6px;
border-left: 4px solid ${borderColor};
box-shadow: 0 1px 3px rgba(0,0,0,0.1);
cursor: pointer;
transition: all 0.2s ease;
`;
// Заголовок
let intervalTitle = `${group.from.toFixed(1)} - ${group.to.toFixed(1)} м`;
if (group.stratigraphy && group.stratigraphy !== 'Не указано') {
intervalTitle += ` • ${group.stratigraphy}`;
}
if (group.lithology && group.lithology !== 'Не указано') {
intervalTitle += ` • ${group.lithology}`;
}
card.innerHTML = `
${intervalTitle}
${group.totalThickness.toFixed(1)} м
`;
// Составляющие интервалы
if (group.intervals && group.intervals.length > 1) {
card.innerHTML += `
Составляющие интервалы (${group.intervals.length}):
${group.intervals.map(interval => `
${interval.from.toFixed(1)}-${interval.to.toFixed(1)} м
${interval.thickness.toFixed(1)} м
${interval.description ? `
${interval.description}
` : ''}
`).join('')}
`;
} else if (group.intervals && group.intervals[0] && group.intervals[0].description) {
card.innerHTML += `
${group.intervals[0].description}
`;
}
// Клик по карточке - сохраняем цвет полоски
card.onclick = (e) => {
e.stopPropagation();
// Снимаем выделение со всех карточек
document.querySelectorAll('.geology-card').forEach(c => {
c.style.background = 'white';
c.style.borderLeft = `4px solid ${c.originalBorderColor || '#e9ecef'}`;
});
// Выделяем текущую карточку, сохраняем её цвет
card.style.background = '#fff7ed';
card.style.borderLeft = `4px solid ${borderColor}`;
card.originalBorderColor = borderColor;
// Выделяем блок в колонке
if (window.geologyBlocks && window.geologyBlocks[index]) {
window.geologyBlocks.forEach(block => {
block.style.border = '1px solid rgba(0,0,0,0.25)';
block.style.boxShadow = 'none';
});
window.geologyBlocks[index].style.border = '2px solid #b91c1c';
window.geologyBlocks[index].style.boxShadow = '0 0 0 2px rgba(185,28,28,0.25)';
window.geologyBlocks[index].scrollIntoView({ behavior: 'smooth', block: 'center' });
}
};
// Инициализируем оригинальный цвет
card.originalBorderColor = borderColor;
return card;
}
```
## 3. УБИРАЕМ ЛИШНИЙ СКРОЛЛ И ФИКСИРУЕМ ШАПКУ:
```javascript
// В функции drawWellStructure, исправляем body:
const body = document.createElement('div');
body.style.cssText = `
display: flex;
position: relative;
overflow-y: auto;
max-height: 60vh;
`;
// Убираем лишний скролл у graphicsScrollContainer
graphicsScrollContainer.style.cssText = `
flex: 1;
overflow: auto;
padding: 10px;
`;
// В columnContainer убираем overflow hidden у внутренних элементов
columnContainer.style.cssText = `
position: relative;
width: 100%;
min-width: 550px;
background: white;
border: 1px solid #cbd5e1;
border-radius: 4px;
`;
```
## 4. ДОБАВЛЯЕМ CSS ДЛЯ ФИКСАЦИИ ШАПКИ ПРИ СКРОЛЛЕ:
```css
/* В стили добавить */
#graphicsScrollContainer {
scrollbar-width: thin;
}
#graphicsScrollContainer .table-header,
#graphicsScrollContainer .column-header {
position: sticky;
top: 0;
z-index: 100;
background: #e2e8f0;
}
```
## 5. ИСПРАВЛЯЕМ ПАРСИНГ КАТЕГОРИЙ БУРЕНИЯ ПРИ ОБЪЕДИНЕНИИ ИНТЕРВАЛОВ:
```javascript
function createMergedGeologyFromDocumentation(docType = 'primary') {
let documentation;
switch (docType) {
case 'primary':
documentation = xmlData.primaryDocumentation;
break;
case 'final':
documentation = xmlData.finalDocumentation;
break;
case 'gis':
documentation = xmlData.gisDocumentation;
break;
default:
documentation = xmlData.primaryDocumentation;
}
if (!documentation || documentation.length === 0) return [];
if (!mergeGeologyIntervals) {
return documentation.map((interval, index) => {
const originalStratigraphy = interval.originalStratigraphy || interval.stratigraphy || 'Не указано';
const convertedStratigraphy = interval.stratigraphy || convertStratigraphyText(originalStratigraphy);
return {
from: interval.from,
to: interval.to,
lithology: interval.lithology,
lithologyId: interval.lithologyId,
lcode: interval.lcode,
stratigraphy: convertedStratigraphy,
originalStratigraphy: originalStratigraphy,
rockCategories: interval.rockCategories,
intervals: [{
from: interval.from,
to: interval.to,
description: interval.description,
numberPP: interval.numberPP,
thickness: interval.thickness,
rockCategories: interval.rockCategories
}],
totalThickness: interval.thickness
};
});
}
// Объединяем интервалы
const groupedIntervals = [];
let currentGroup = null;
documentation.forEach((interval) => {
const originalStratigraphy = interval.originalStratigraphy || interval.stratigraphy || 'Не указано';
const convertedStratigraphy = interval.stratigraphy || convertStratigraphyText(originalStratigraphy);
const sameLithology = currentGroup &&
currentGroup.lithology === interval.lithology &&
currentGroup.lithologyId === interval.lithologyId;
const sameStratigraphy = currentGroup &&
currentGroup.originalStratigraphy === originalStratigraphy;
const shouldMerge = sameLithology && sameStratigraphy;
if (!currentGroup || !shouldMerge) {
if (currentGroup) {
groupedIntervals.push(currentGroup);
}
currentGroup = {
from: interval.from,
to: interval.to,
lithology: interval.lithology,
lithologyId: interval.lithologyId,
lcode: interval.lcode,
stratigraphy: convertedStratigraphy,
originalStratigraphy: originalStratigraphy,
rockCategories: interval.rockCategories,
intervals: [{
from: interval.from,
to: interval.to,
description: interval.description,
numberPP: interval.numberPP,
thickness: interval.thickness,
rockCategories: interval.rockCategories
}],
totalThickness: interval.thickness
};
} else {
currentGroup.to = interval.to;
currentGroup.totalThickness += interval.thickness;
currentGroup.intervals.push({
from: interval.from,
to: interval.to,
description: interval.description,
numberPP: interval.numberPP,
thickness: interval.thickness,
rockCategories: interval.rockCategories
});
// Объединяем rockCategories
if (interval.rockCategories && interval.rockCategories !== 'Не указано') {
if (!currentGroup.rockCategories) currentGroup.rockCategories = '';
currentGroup.rockCategories += '; ' + interval.rockCategories;
}
}
});
if (currentGroup) {
groupedIntervals.push(currentGroup);
}
return groupedIntervals;
}
```
Теперь:
- ✅ Категории бурения должны отображаться из данных интервалов
- ✅ Цвет полоски в карточках сохраняется при клике
- ✅ Убран лишний вертикальный скролл
- ✅ Шапка фиксируется при прокрутке
- ✅ Объединение интервалов сохраняет категории бурения