feat: chart2/3/4 + section 5 (regional breakdown)

- chart2_leaders: horizontal ranked bars with highlight & category coloring
- chart3_ebitdaGroups: vertical bars colored by sign (green ≥0, orange <0)
- chart4_regionCompare: side-by-side bar panels with shared y-scale
- document.js: new section 5 'Региональный разрез и эффективность' between
  sections 4 and 6, renders chart2/3/4 with figure captions
- index.js: render hooks for data.leaders, data.ebitda, data.regionComparison
- examples/russia.js: demo data for all three new charts
This commit is contained in:
Ник
2026-06-08 16:34:07 +03:00
parent 0255d2591d
commit a0af0ba772
6 changed files with 419 additions and 0 deletions
+34
View File
@@ -3,6 +3,9 @@
*/
const { chart1_priceAndMargin } = require('./charts/chart1')
const { chart2_leaders } = require('./charts/chart2')
const { chart3_ebitdaGroups } = require('./charts/chart3')
const { chart4_regionCompare } = require('./charts/chart4')
const { chart5_scenarioMargins } = require('./charts/chart5')
const { buildDocument } = require('./generators/document')
const { PALETTE } = require('./data/palette')
@@ -42,6 +45,34 @@ async function generateReport (config) {
})
}
if (data.leaders && data.leaders.items) {
charts.chart2 = await chart2_leaders({
items: data.leaders.items,
categories: data.leaders.categories || null,
highlightName: data.leaders.highlightName || null,
unit: data.leaders.unit || 'руб./кг',
sort: data.leaders.sort !== false,
regionLabel: `${subject.name} · ${data.leaders.title || 'Лидеры по закупочной цене'} · ${data.leaders.unit || 'руб./кг'}`
})
}
if (data.ebitda) {
charts.chart3 = await chart3_ebitdaGroups({
groups: data.ebitda.groups || data.ebitda,
unit: (data.ebitda.unit) || 'EBITDA-маржа, %',
regionLabel: `${subject.name} · Эффективность по группам хозяйств · %`
})
}
if (data.regionComparison) {
charts.chart4 = await chart4_regionCompare({
left: data.regionComparison.left,
right: data.regionComparison.right,
unit: data.regionComparison.unit || 'руб./кг',
regionLabel: `${subject.name} · Сравнение регионов · ${data.regionComparison.unit || 'руб./кг'}`
})
}
// 2) Собираем DOCX
return buildDocument({ subject, period, data, text, meta, charts })
}
@@ -52,6 +83,9 @@ module.exports = {
// Экспортируем внутренности для возможности кастомизации
charts: {
chart1_priceAndMargin,
chart2_leaders,
chart3_ebitdaGroups,
chart4_regionCompare,
chart5_scenarioMargins,
}
}