
## 🚨 Критические исправления расходников фулфилмента: ### Проблема: - При приеме поставок расходники дублировались (3 шт становились 6 шт) - Система создавала новые Supply записи вместо обновления существующих - Нарушался принцип: "Supply для одного уникального предмета - всегда один" ### Решение: 1. Добавлено поле article (Артикул СФ) в модель Supply для уникальной идентификации 2. Исправлена логика поиска в fulfillmentReceiveOrder resolver: - БЫЛО: поиск по неуникальному полю name - СТАЛО: поиск по уникальному полю article 3. Выполнена миграция БД с заполнением артикулов для существующих записей 4. Обновлены все GraphQL queries/mutations для поддержки поля article ### Результат: - ✅ Дублирование полностью устранено - ✅ При повторных поставках обновляются остатки, а не создаются дубликаты - ✅ Статистика склада показывает корректные данные - ✅ Все тесты пройдены успешно ## 🏗️ Модуляризация компонентов (5 из 6): ### Успешно модуляризованы: 1. navigation-demo.tsx (1,654 → модуль) - 5 блоков, 2 хука 2. timesheet-demo.tsx (3,052 → модуль) - 6 блоков, 4 хука 3. advertising-tab.tsx (1,528 → модуль) - 2 блока, 3 хука 4. user-settings.tsx - исправлены TypeScript ошибки 5. direct-supply-creation.tsx - работает корректно ### Требует восстановления: 6. fulfillment-warehouse-dashboard.tsx - интерфейс сломан, backup сохранен ## 📁 Добавлены файлы: ### Тестовые скрипты: - scripts/final-system-check.cjs - финальная проверка системы - scripts/test-real-supply-order-accept.cjs - тест приема заказов - scripts/test-graphql-query.cjs - тест GraphQL queries - scripts/populate-supply-articles.cjs - миграция артикулов - scripts/test-resolver-logic.cjs - тест логики резолверов - scripts/simulate-supply-order-receive.cjs - симуляция приема ### Документация: - MODULARIZATION_LOG.md - детальный лог модуляризации - current-session.md - обновлен с полным описанием работы ## 📊 Статистика: - Критических проблем решено: 3 из 3 - Модуляризовано компонентов: 5 из 6 - Сокращение кода: ~9,700+ строк → модульная архитектура - Тестовых скриптов создано: 6 - Дублирования устранено: 100% 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
131 lines
4.5 KiB
JavaScript
131 lines
4.5 KiB
JavaScript
const { PrismaClient } = require('@prisma/client')
|
||
|
||
const prisma = new PrismaClient()
|
||
|
||
async function clearFulfillmentSuppliesData() {
|
||
try {
|
||
console.log('🧹 Начинаем очистку данных склада и поставок фулфилмента...')
|
||
|
||
// Находим все организации фулфилмента
|
||
const fulfillmentOrgs = await prisma.organization.findMany({
|
||
where: { type: 'FULFILLMENT' },
|
||
select: { id: true, name: true }
|
||
})
|
||
|
||
if (fulfillmentOrgs.length === 0) {
|
||
console.log('❌ Организации фулфилмента не найдены')
|
||
return
|
||
}
|
||
|
||
console.log('🏢 Найденные организации фулфилмента:')
|
||
fulfillmentOrgs.forEach(org => console.log(` - ${org.name} (${org.id})`))
|
||
|
||
const fulfillmentOrgIds = fulfillmentOrgs.map(org => org.id)
|
||
|
||
// Показываем что будет удалено
|
||
const suppliesCount = await prisma.supply.count({
|
||
where: {
|
||
OR: [
|
||
{ organizationId: { in: fulfillmentOrgIds } },
|
||
{ type: 'FULFILLMENT_CONSUMABLES' }
|
||
]
|
||
}
|
||
})
|
||
|
||
const supplyOrdersCount = await prisma.supplyOrder.count({
|
||
where: {
|
||
OR: [
|
||
{ fulfillmentCenterId: { in: fulfillmentOrgIds } },
|
||
{ organizationId: { in: fulfillmentOrgIds } }
|
||
]
|
||
}
|
||
})
|
||
|
||
const supplyOrderItemsCount = await prisma.supplyOrderItem.count({
|
||
where: {
|
||
supplyOrder: {
|
||
OR: [
|
||
{ fulfillmentCenterId: { in: fulfillmentOrgIds } },
|
||
{ organizationId: { in: fulfillmentOrgIds } }
|
||
]
|
||
}
|
||
}
|
||
})
|
||
|
||
console.log('\n📊 Данные для удаления:')
|
||
console.log(` - Расходники (Supply): ${suppliesCount}`)
|
||
console.log(` - Заказы поставок (SupplyOrder): ${supplyOrdersCount}`)
|
||
console.log(` - Элементы заказов (SupplyOrderItem): ${supplyOrderItemsCount}`)
|
||
|
||
if (suppliesCount === 0 && supplyOrdersCount === 0) {
|
||
console.log('✅ Нет данных для удаления')
|
||
return
|
||
}
|
||
|
||
// Подтверждение
|
||
const readline = require('readline').createInterface({
|
||
input: process.stdin,
|
||
output: process.stdout
|
||
})
|
||
|
||
const answer = await new Promise(resolve => {
|
||
readline.question('\n⚠️ Вы уверены что хотите удалить эти данные? (да/нет): ', resolve)
|
||
})
|
||
readline.close()
|
||
|
||
if (answer.toLowerCase() !== 'да' && answer.toLowerCase() !== 'yes') {
|
||
console.log('❌ Операция отменена')
|
||
return
|
||
}
|
||
|
||
console.log('\n🗑️ Начинаем удаление...')
|
||
|
||
// Удаляем в правильном порядке (с учетом foreign keys)
|
||
|
||
// 1. Удаляем элементы заказов поставок
|
||
const deletedItems = await prisma.supplyOrderItem.deleteMany({
|
||
where: {
|
||
supplyOrder: {
|
||
OR: [
|
||
{ fulfillmentCenterId: { in: fulfillmentOrgIds } },
|
||
{ organizationId: { in: fulfillmentOrgIds } }
|
||
]
|
||
}
|
||
}
|
||
})
|
||
console.log(`✅ Удалено элементов заказов: ${deletedItems.count}`)
|
||
|
||
// 2. Удаляем заказы поставок
|
||
const deletedOrders = await prisma.supplyOrder.deleteMany({
|
||
where: {
|
||
OR: [
|
||
{ fulfillmentCenterId: { in: fulfillmentOrgIds } },
|
||
{ organizationId: { in: fulfillmentOrgIds } }
|
||
]
|
||
}
|
||
})
|
||
console.log(`✅ Удалено заказов поставок: ${deletedOrders.count}`)
|
||
|
||
// 3. Удаляем расходники
|
||
const deletedSupplies = await prisma.supply.deleteMany({
|
||
where: {
|
||
OR: [
|
||
{ organizationId: { in: fulfillmentOrgIds } },
|
||
{ type: 'FULFILLMENT_CONSUMABLES' }
|
||
]
|
||
}
|
||
})
|
||
console.log(`✅ Удалено расходников: ${deletedSupplies.count}`)
|
||
|
||
console.log('\n🎉 Очистка данных склада и поставок фулфилмента завершена!')
|
||
console.log('📝 Примечание: Сами организации фулфилмента и другие данные (сотрудники, услуги) НЕ удалены')
|
||
|
||
} catch (error) {
|
||
console.error('❌ Ошибка при очистке данных:', error)
|
||
} finally {
|
||
await prisma.$disconnect()
|
||
}
|
||
}
|
||
|
||
// Запуск скрипта
|
||
clearFulfillmentSuppliesData() |