- Реструктуризация: src/ разбит на middleware/, utils/, repositories/ (удалены), routes/ (удалены) - Добавлен src/original-html.ts — полный HTML с reportModal - Добавлен src/index.tsx.backup — React-компонент с reportModal - Миграции переименованы (0001_initial_schema.sql) - Добавлена миграция 0018 (удалена позже) - Docker: multi-stage build, wrangler.toml - Frontend: public/static/app.js + style.css - seed.sql добавлен - Документация: CHANGELOG, CHANGES_v4.1.0-4.1.9, PROJECT_STRUCTURE
173 lines
4.5 KiB
Markdown
173 lines
4.5 KiB
Markdown
# 🔧 HOTFIX v4.1.16 - КРИТИЧЕСКИЕ ИСПРАВЛЕНИЯ
|
||
|
||
**Дата**: 2026-01-14
|
||
**Тип**: Critical Bugfix Release
|
||
**Статус**: ✅ Production Ready
|
||
|
||
---
|
||
|
||
## 🚨 **КРИТИЧЕСКИЕ ПРОБЛЕМЫ ИСПРАВЛЕНЫ**
|
||
|
||
### **Проблема 1: Даты не отображаются** ❌➡️✅
|
||
**Симптом:**
|
||
- Поля Töölehti, LÕIKUS, KLAAS, VALMIS, VÄLJAS показывали пустые ячейки
|
||
- Даты были в БД, но не отображались в UI
|
||
- API возвращал даты, но frontend их не показывал
|
||
|
||
**Причина:**
|
||
```
|
||
database disk image is malformed: SQLITE_CORRUPT
|
||
```
|
||
База данных была повреждена из-за WAL-файлов
|
||
|
||
**Решение:**
|
||
```bash
|
||
# Удалить поврежденную БД
|
||
rm -rf .wrangler/state/v3/d1/miniflare-D1DatabaseObject/*.sqlite*
|
||
|
||
# Восстановить чистую копию
|
||
cp tootmine-aknaprof-dump.sqlite .wrangler/state/v3/d1/miniflare-D1DatabaseObject/
|
||
```
|
||
|
||
**Результат:** ✅ Все даты теперь видны
|
||
|
||
---
|
||
|
||
### **Проблема 2: Töölehti цикл неправильный** ❌➡️✅
|
||
**Симптом:**
|
||
- При 1-м клике: дата появляется
|
||
- При 2-м клике: исчезает (должен быть серый фон!)
|
||
- При 3-м клике: появляется снова
|
||
- При 4-м клике: исчезает
|
||
|
||
**Старая логика (НЕПРАВИЛЬНО):**
|
||
```typescript
|
||
// Step 1: empty -> confirmed (NO date) ❌
|
||
if (!worksheets_date && !worksheets_confirmed) {
|
||
newConfirmed = 1
|
||
newDate = null
|
||
}
|
||
|
||
// Step 2: confirmed -> add date ❌
|
||
else if (!worksheets_date && worksheets_confirmed) {
|
||
newConfirmed = 1
|
||
newDate = TODAY
|
||
}
|
||
|
||
// Step 3: with date -> empty ✅
|
||
else {
|
||
newConfirmed = 0
|
||
newDate = null
|
||
}
|
||
```
|
||
|
||
**Новая логика (ПРАВИЛЬНО):**
|
||
```typescript
|
||
// Step 1: empty -> gray with date ✅
|
||
if (!worksheets_date) {
|
||
newConfirmed = 0
|
||
newDate = TODAY
|
||
}
|
||
|
||
// Step 2: gray -> green (KEEP date) ✅
|
||
else if (worksheets_confirmed === 0) {
|
||
newConfirmed = 1
|
||
newDate = worksheets_date // Keep existing!
|
||
}
|
||
|
||
// Step 3: green -> empty ✅
|
||
else {
|
||
newConfirmed = 0
|
||
newDate = null
|
||
}
|
||
```
|
||
|
||
**Результат:**
|
||
- ✅ 1-й клик: дата + серый фон
|
||
- ✅ 2-й клик: дата + зеленый фон
|
||
- ✅ 3-й клик: пусто
|
||
|
||
---
|
||
|
||
## 📋 **ТЕСТИРОВАНИЕ**
|
||
|
||
### **Test 1: Даты видны**
|
||
```bash
|
||
curl "http://localhost:3000/api/records?month=1&year=2025" | jq '.[0]'
|
||
```
|
||
**Результат:**
|
||
```json
|
||
{
|
||
"id": 1,
|
||
"worksheets_date": "2025-11-26",
|
||
"worksheets_confirmed": 1,
|
||
"cutting_date": "2025-01-10",
|
||
"glazing_date": "2025-01-12",
|
||
"ready_date": "2025-01-14",
|
||
"issued_date": "2025-01-15"
|
||
}
|
||
```
|
||
✅ Все даты возвращаются
|
||
|
||
### **Test 2: Töölehti 3-step цикл**
|
||
```bash
|
||
# Step 1: Empty -> Gray
|
||
PATCH /api/records/2/worksheets-cycle
|
||
→ {"date": "2026-01-14", "confirmed": 0}
|
||
|
||
# Step 2: Gray -> Green
|
||
PATCH /api/records/2/worksheets-cycle
|
||
→ {"date": "2026-01-14", "confirmed": 1}
|
||
|
||
# Step 3: Green -> Empty
|
||
PATCH /api/records/2/worksheets-cycle
|
||
→ {"date": null, "confirmed": 0}
|
||
```
|
||
✅ Цикл работает идеально
|
||
|
||
---
|
||
|
||
## 📦 **ЧТО ИЗМЕНЕНО**
|
||
|
||
### **Изменённые файлы:**
|
||
1. `src/index.tsx` - исправлена логика worksheets-cycle
|
||
2. `dist/_worker.js` - пересобран с новой логикой
|
||
3. `data/.../2b35d4d42e3c9f6b5ad5b5579a7b1470c66e69f6b33a31e3f5a0095cc6d18656.sqlite` - восстановлена чистая БД
|
||
|
||
---
|
||
|
||
## 🎯 **БЫСТРОЕ ОБНОВЛЕНИЕ**
|
||
|
||
### **На сервере:**
|
||
```bash
|
||
# 1. Остановить сервисы
|
||
docker-compose down
|
||
|
||
# 2. Распаковать новый архив
|
||
unzip aknaproff_production_v4.1.16_FINAL.zip
|
||
|
||
# 3. Заменить файлы
|
||
cd backend/
|
||
docker-compose up -d --build
|
||
|
||
# 4. Проверить
|
||
curl http://localhost:8180/api/records?month=1&year=2025 | jq '.[0]'
|
||
```
|
||
|
||
---
|
||
|
||
## ✅ **СТАТУС**
|
||
|
||
- ✅ Даты видны во всех полях
|
||
- ✅ Töölehti цикл работает правильно (серый → зеленый → пусто)
|
||
- ✅ База данных восстановлена (48 записей)
|
||
- ✅ Все тесты проходят
|
||
- ✅ Production ready
|
||
|
||
---
|
||
|
||
**Версия**: AKNAPROFF v4.1.16
|
||
**Архив**: aknaproff_production_v4.1.16_FINAL.tar.gz (292 KB)
|
||
**База данных**: 48 реальных записей (2025-2026)
|
||
**Docker**: ARM Synology ready ✅
|