feat: weather conditions check from stroy-bot-main

Ports the weather check added to stroy-bot-main on 2026-10-16: daily
station weather, report positions with weather per shift and the AI
assessment of working conditions. Opens as ?page=weather&start=&end=
instead of the #weathercheck hash, and hub dates survive the way back.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Тимур Городецкий
2026-10-20 09:47:02 +05:00
parent b18cf50efd
commit d606f8371c
33 changed files with 1365 additions and 12 deletions
@@ -0,0 +1,66 @@
// Тексты сверки погодных условий — дословно из stroy-bot-main.
export const WEATHER_TEXTS = {
openButton: 'Сверка погодных условий',
back: 'Разделы проекта',
headerLabel: 'Сверка погодных условий',
periodPrefix: 'Период:',
noProject: 'Проект не выбран. Вернитесь назад и выберите проект.',
noPeriod: 'Период не указан. Вернитесь назад и выберите даты начала и конца.',
loading: 'Загрузка данных…',
loadError: (details: string): string => `Не удалось загрузить данные: ${details}`,
station: {
name: (name: string): string => `Метеостанция ${name}`,
code: (code: string): string => `WIGOS ${code}`,
distance: (km: string): string => ` · ${km} км от объекта`
},
days: {
title: 'Погода по дням',
empty: 'Нет данных наблюдений за период',
columns: {
date: 'Дата',
observations: 'Наблюдений',
tempMin: 'T мин, °C',
tempMax: 'T макс, °C',
wind: 'Ветер, м/с',
gust: 'Порывы, м/с',
precipitation: 'Осадки, мм',
phenomena: 'Явления'
}
},
positions: {
title: 'Позиции и оценка условий труда',
empty: 'Нет позиций за период',
assessButton: 'Запросить оценку ИИ по международным стандартам',
assessLoading: 'Идёт оценка, это может занять до минуты…',
assessError: (details: string): string => `Не удалось получить оценку: ${details}`,
assessSummary: (assessed: number, skipped: number): string =>
`Оценено позиций: ${assessed}` + (skipped ? `, пропущено: ${skipped}` : ''),
columns: {
date: 'Дата',
profession: 'Профессия / вид работ',
shift: 'Смена',
hours: 'Часы',
hoursType: 'Тип работ',
headcount: 'Чел.',
weather: 'Погода в смену',
assessment: 'Оценка',
comment: 'Комментарий',
downtime: 'Акт простоя'
},
weather: {
temperature: (min: string, max: string): string => `T ${min}…${max} °C`,
wind: (wind: string): string => `Ветер ${wind} м/с`,
gust: (gust: string): string => `, порывы ${gust} м/с`,
precipitation: (value: string): string => `Осадки ${value} мм`,
dewpoint: (value: string): string => `Точка росы до ${value} °C`,
visibility: (value: string): string => `Видимость от ${value}`,
observations: (value: string): string => `Наблюдений: ${value}`,
noData: 'нет данных'
},
downtimeRecommended: 'Рекомендован',
downtimeNotRequired: 'Не требуется'
},
notesTitle: 'Примечания',
empty: '—'
} as const;