diff --git a/bot.js b/bot.js index 690e09a..96eae0c 100644 --- a/bot.js +++ b/bot.js @@ -18,7 +18,6 @@ const { PromocodeModel, EnterpriseModel, WarehouseModel, - TruckModel, SaleModel, ResourcePriceModel, SkillsModel, @@ -373,13 +372,42 @@ bot.hears('🏗️ Предприятия', async (ctx) => { if (warehouse) { buttons.push([{ text: '🚛 Управление складом', callback_data: 'manage_warehouse' }]); } else { - buttons.push([{ text: '🗄️ Построить склад', callback_data: 'open_warehouse' }]); + buttons.push([{ text: '🗄️ Построить склад', callback_data: 'buy_warehouse' }]); } // Возвращаем меню с кнопками return await ctx.reply(message, Markup.inlineKeyboard(buttons).resize()); }); +bot.action('enterprise_menu', async (ctx) => { + const user = await UserModel.findByPk(ctx.from.id); + const warehouse = await WarehouseModel.findOne({ where: { playerId: user.telegram_id } }); + + const enterprises = await EnterpriseModel.findAll({ + where: { playerId: user.telegram_id } + }); + let message = `🏗️ Меню предприятий:\n`; + message += `У вас: ${enterprises.length} предприятий.\n`; + message += warehouse + ? `🗄️ Единый склад: Доступен (Ёмкость: ${warehouse.capacity} ед.)\n` + : `🗄️ Единый склад: Не построен.\n`; + + const buttons = []; + + // Добавляем кнопки для предприятий + buttons.push([{ text: '🏭 Мои предприятия', callback_data: 'my_enterprises' }]); + buttons.push([{ text: '🛠️ Построить предприятие', callback_data: 'build_enterprise' }]); + + // Кнопка для управления или постройки склада + if (warehouse) { + buttons.push([{ text: '🚛 Управление складом', callback_data: 'manage_warehouse' }]); + } else { + buttons.push([{ text: '🗄️ Построить склад', callback_data: 'buy_warehouse' }]); + } + + // Возвращаем меню с кнопками + return await ctx.editMessageText(message, Markup.inlineKeyboard(buttons).resize()); +}); // Функция для преобразования типа ресурса в эмодзи function getEnterpriseEmoji(resourceType) { @@ -407,38 +435,20 @@ bot.action('my_enterprises', async (ctx) => { let message = `🏭 Мои предприятия:\n\n`; const buttons = []; - for (const enterprise of enterprises) { - const { id, name, level, efficiency, currentResources, resourceType, warehouseCapacity } = enterprise; + enterprises.forEach((enterprise) => { + message += `🔹 ${enterprise.name} (Уровень: ${enterprise.level}, Эффективность: ${enterprise.efficiency} ед/ч)\n`; + buttons.push([ + { text: `📈 Улучшить ${enterprise.name}`, callback_data: `upgrade_${enterprise.id}` }, + { text: `🚛 Управлять ${enterprise.name}`, callback_data: `manage_${enterprise.id}` } + ]); + }); - message += `🔹 [ID: ${id}] ${getEnterpriseEmoji(resourceType)} ${name} st. ${level}\n └── ${currentResources}/${warehouseCapacity} [${efficiency} ед/ч]\n\n`; + buttons.push([{ text: '⬅️ Назад', callback_data: 'enterprise_menu' }]); - const truck = await TruckModel.findOne({ where: { enterpriseId: id } }); - const warehouse = await WarehouseModel.findOne({ where: { playerId: user.telegram_id } }); - - const enterpriseButtons = [ - { text: `ID: 📈 ${id}`, callback_data: `upgrade_${id}` }, - ]; - - if (!truck) { - enterpriseButtons.push({ text: `🛻 ID: ${id}`, callback_data: `hire_truck_${id}` }); - }else{ - enterpriseButtons.push({ text: `🚛 ID: ${id}`, callback_data: `upgrade_truck_${id}` }); - } - - enterpriseButtons.push({ text: `💰 ID: ${id}`, callback_data: `sell_all_${id}` }); - - if (warehouse) { - enterpriseButtons.push({ text: `🔄 ID: ${id}`, callback_data: `transfer_from_${id}` }); - } - - buttons.push(enterpriseButtons); - } - message += '\n\n[📈 - Улучшить]\n[🛻 - Нанять грузовик]\n 🚛 - Улучшить грузовик\n[💰 - Продать ресурсы с предприятия]\n[🔄 - Перевезти все на склад]' - buttons.push([{ text: '⬅️ Назад', callback_data: 'back_to_menu' }]); - - return await ctx.reply(message, Markup.inlineKeyboard(buttons).resize()); + return await ctx.editMessageText(message, Markup.inlineKeyboard(buttons).resize()); }); + // Построение предприятия bot.action('build_enterprise', async (ctx) => { try { @@ -475,7 +485,7 @@ bot.action('build_enterprise', async (ctx) => { } message += '\nВыберите тип предприятия:'; - return await ctx.reply(message, Markup.inlineKeyboard(buttons).resize()); + return await ctx.editMessageText(message, Markup.inlineKeyboard(buttons).resize()); } catch (error) { console.error('Ошибка в build_enterprise:', error); return await ctx.reply('Произошла ошибка при обработке запроса. Попробуйте снова.'); @@ -508,7 +518,7 @@ bot.action(/build_(wood|coal|oil|metall|gold|diamond)/, async (ctx) => { // Снимаем деньги с баланса await user.update({ money: user.money - price }) - return await ctx.reply(`Предприятие ${enterprise.name} (ID: ${enterprise.id}) построено!`) + return await ctx.editMessageText(`Предприятие ${enterprise.name} (ID: ${enterprise.id}) построено!`) }) // Функция для расчета стоимости предприятия @@ -555,7 +565,7 @@ bot.action('buy_warehouse', async (ctx) => { }) await user.update({ money: user.money - 500000 }) - return await ctx.reply(`Вы успешно купили единый склад!`) + return await ctx.editMessageText(`Вы успешно купили единый склад!`) }) // Управление складом @@ -583,21 +593,45 @@ bot.action('manage_warehouse', async (ctx) => { [{ text: '🚚 Купить транспорт', callback_data: 'buy_truck' }] ]; - return await ctx.reply(message, Markup.inlineKeyboard(buttons).resize()); + return await ctx.editMessageText(message, Markup.inlineKeyboard(buttons).resize()); }); +bot.action('warehouse_management', async (ctx) => { + let user = await UserModel.findByPk(ctx.from.id) + let warehouse = await WarehouseModel.findOne({ where: { playerId: user.telegram_id } }) + + if (!warehouse) { + return await ctx.reply(`У вас нет склада. Вы можете купить его за 500,000 руб.`, Markup.inlineKeyboard([ + [{ text: 'Купить склад', callback_data: 'buy_warehouse' }] + ]).resize()) + } + + let message = ` + 🏗️ Единый склад + Емкость: ${warehouse.capacity} ед. + Ресурсы: + 🌲 Дерево: ${warehouse.wood || 0} + ⛏️ Уголь: ${warehouse.coal || 0} + 🛢️ Нефть: ${warehouse.oil || 0} + 🛠️ Металл: ${warehouse.metall || 0} + 💰 Золото: ${warehouse.gold || 0} + 💎 Алмазы: ${warehouse.diamond || 0} + ` + return await ctx.editMessageText(message, Markup.inlineKeyboard([ + [{ text: 'Управление транспортом', callback_data: 'manage_trucks' }], + [{ text: 'Продать ресурсы', callback_data: 'sell_from_warehouse' }] + ]).resize()) +}) + // Управление предприятием bot.action(/manage_(\d+)/, async (ctx) => { let enterpriseId = ctx.match[1] let enterprise = await EnterpriseModel.findByPk(enterpriseId) if (!enterprise) return await ctx.reply(`Предприятие не найдено.`) - const buttons = [ - [{ text: 'Продать ресурсы', callback_data: 'sell_resources' }], - [{ text: 'Нанять грузовик', callback_data: 'hire_truck' }] - ]; + // Логика управления предприятием (например, прокачка или продажа ресурсов) - return await ctx.reply(`Вы управляете предприятием ${enterprise.name} (ID: ${enterprise.id}).`, Markup.inlineKeyboard(buttons).resize()) + return await ctx.editMessageText(`Вы управляете предприятием ${enterprise.name} (ID: ${enterprise.id}).`) }) bot.action('transfer_resources', async (ctx) => { const user = await UserModel.findByPk(ctx.from.id); @@ -619,47 +653,30 @@ bot.action('transfer_resources', async (ctx) => { return [{ text: `🏭 ${ent.name}`, callback_data: `transfer_from_${ent.id}` }]; }); - return await ctx.reply(message, Markup.inlineKeyboard(buttons).resize()); + return await ctx.editMessageText(message, Markup.inlineKeyboard(buttons).resize()); }); // Перевозка с конкретного предприятия bot.action(/transfer_from_(\d+)/, async (ctx) => { const enterpriseId = ctx.match[1]; + const user = await UserModel.findByPk(ctx.from.id); + const warehouse = await WarehouseModel.findOne({ where: { playerId: user.telegram_id } }); + const enterprise = await EnterpriseModel.findByPk(enterpriseId); - if (!enterprise) { - return await ctx.reply('Предприятие не найдено.'); + return await ctx.editMessageText('Предприятие не найдено.'); } - const { currentResources, resourceType, playerId } = enterprise; + let message = `🚛 Перевозка с предприятия ${enterprise.name}:\n`; + message += `🌲 Дерево: ${enterprise.wood || 0}\n`; + message += `⛏️ Уголь: ${enterprise.coal || 0}\n`; + message += `🛢️ Нефть: ${enterprise.oil || 0}\n`; + message += `⚙️ Металл: ${enterprise.metall || 0}\n`; + message += `🥇 Золото: ${enterprise.gold || 0}\n`; + message += `💎 Алмазы: ${enterprise.diamond || 0}\n`; + message += `\nВведите количество ресурса для перевозки.`; - if (currentResources === 0) { - return await ctx.reply('На предприятии нет ресурсов для перевода.'); - } - - const warehouse = await WarehouseModel.findOne({ where: { playerId } }); - - if (!warehouse) { - return await ctx.reply('У вас нет склада для перевода ресурсов.'); - } - - const freeCapacity = warehouse.capacity - getWarehouseUsedCapacity(warehouse); - const transferAmount = Math.min(currentResources, freeCapacity); - - if (transferAmount === 0) { - return await ctx.reply('Склад заполнен. Перевод невозможен.'); - } - - // Перевод ресурсов - warehouse[resourceType] = (warehouse[resourceType] || 0) + transferAmount; - enterprise.currentResources -= transferAmount; - - await warehouse.save(); - await enterprise.save(); - - return await ctx.reply( - `Успешно переведено ${transferAmount} ед. ${resourceType} с предприятия в склад.` - ); + return await ctx.reply(message); }); bot.command('ent_rename', async (ctx) => { @@ -697,7 +714,7 @@ bot.action('upgrade_enterprise', async (ctx) => { buttons.push({ text: `Прокачать ${enterprise.name}`, callback_data: `upgrade_${enterprise.id}` }) }) - return await ctx.reply(`Выберите предприятие для прокачки:`, Markup.inlineKeyboard(buttons).resize()) + return await ctx.editMessageText(`Выберите предприятие для прокачки:`, Markup.inlineKeyboard(buttons).resize()) }) bot.action(/upgrade_(\d+)/, async (ctx) => { @@ -721,229 +738,73 @@ bot.action(/upgrade_(\d+)/, async (ctx) => { // Снимаем деньги с баланса await user.update({ balance: user.balance - upgradeCost }) - return await ctx.reply(`Предприятие ${enterprise.name} успешно прокачано! Уровень: ${enterprise.level}, Производительность: ${enterprise.efficiency} ед/ч.`) + return await ctx.editMessageText(`Предприятие ${enterprise.name} успешно прокачано! Уровень: ${enterprise.level}, Производительность: ${enterprise.efficiency} ед/ч.`) }) -// Показ списка предприятий bot.action('sell_resources', async (ctx) => { - const user = await UserModel.findByPk(ctx.from.id); - const enterprises = await EnterpriseModel.findAll({ - where: { playerId: user.telegram_id } - }); - - if (enterprises.length === 0) { - return await ctx.reply('У вас нет предприятий для продажи ресурсов.'); - } - - let message = 'Список ваших предприятий и их ресурсы:\n\n'; - enterprises.forEach((enterprise, index) => { - message += `${index + 1}. ${enterprise.name} (${enterprise.resourceType}): ${enterprise.currentResources} единиц\n`; - }); - - message += `\nЧтобы продать ресурсы, используйте команду:\n/sellres <номер_предприятия> <количество>\nПример: /sellres 1 50`; - return await ctx.reply(message); -}); - -// Обработка продажи ресурсов -bot.command('sellres', async (ctx) => { - const user = await UserModel.findByPk(ctx.from.id); - const [enterpriseId, amountToSell] = ctx.message.text.split(' ').slice(1); - - if (!enterpriseId || !amountToSell) { - return await ctx.reply('Неверный формат команды. Пример: /sellres 1 50'); - } - - const enterprise = await EnterpriseModel.findByPk(enterpriseId, { - where: { playerId: user.telegram_id } - }); - - if (!enterprise) { - return await ctx.reply('Предприятие с таким id не найдено.'); - } - - const amount = parseInt(amountToSell, 10); - - if (isNaN(amount) || amount <= 0) { - return await ctx.reply('Укажите корректное количество для продажи.'); - } - - if (enterprise.currentResources < amount) { - return await ctx.reply( - `На предприятии ${enterprise.name} недостаточно ресурсов. Доступно: ${enterprise.currentResources} единиц.` - ); - } - - const resourcePrice = await ResourcePriceModel.findOne({ - where: { resource: enterprise.resourceType } - }); - - if (!resourcePrice) { - return await ctx.reply('Не удалось получить цену ресурса.'); - } - - const totalSale = Math.floor(amount * resourcePrice.price); - - // Обновляем данные - enterprise.currentResources -= amount; - await enterprise.save(); - - user.money += totalSale; - await user.save(); - - // Инфляция: уменьшение цены ресурса - resourcePrice.price = Math.round( - resourcePrice.price * Math.exp(-resourcePrice.fluctuationRate * amount) - ); - - // Гарантируем, что цена не упадет ниже 50% от базовой цены - resourcePrice.price = Math.max(resourcePrice.price, Math.round(resourcePrice.basePrice * 0.5)); - - await resourcePrice.save(); - - return await ctx.reply( - `Вы продали ${amount} единиц ${enterprise.resourceType} с предприятия ${enterprise.name} за ${totalSale} монет.\nТекущая цена за единицу: ${resourcePrice.price.toFixed(0)} монет.` - ); -}); - - -// Восстановление цен ресурсов -const recoverResourcePrices = async () => { - const resources = await ResourcePriceModel.findAll(); - - for (const resource of resources) { - if (resource.price < resource.basePrice) { - resource.price = Math.min( - resource.price + resource.basePrice * resource.recoveryRate, - resource.basePrice // Не превышать базовую цену - ); - await resource.save(); + let user = await UserModel.findByPk(ctx.from.id) + let enterprises = await EnterpriseModel.findAll({ + where: { + playerId: user.telegram_id } - } -}; + }) -// Запускаем процесс восстановления цен каждые 15 минут -setInterval(recoverResourcePrices, 15 * 60 * 1000); + if (enterprises.length === 0) return await ctx.reply(`У вас нет предприятий для продажи ресурсов.`) -bot.action(/sell_all_(\d+)/, async (ctx) => { - const enterpriseId = ctx.match[1]; - const enterprise = await EnterpriseModel.findByPk(enterpriseId); + let buttons = [] + enterprises.forEach(enterprise => { + buttons.push({ text: `Продать ресурсы с ${enterprise.name}`, callback_data: `sell_${enterprise.id}` }) + }) - if (!enterprise) { - return await ctx.reply('Предприятие не найдено.'); + return await ctx.editMessageText(`Выберите предприятие для продажи ресурсов:`, Markup.inlineKeyboard(buttons).resize()) +}) + +bot.action(/sell_(\d+)/, async (ctx) => { + let user = await UserModel.findByPk(ctx.from.id) + let enterpriseId = ctx.match[1] + let enterprise = await EnterpriseModel.findByPk(enterpriseId) + + if (!enterprise) return await ctx.reply(`Предприятие не найдено.`) + + // Логика продажи ресурсов с предприятия + const resourceQuantity = await ResourceModel.findOne({ + where: { playerId: user.telegram_id, type: enterprise.resourceType } + }) + + if (!resourceQuantity || resourceQuantity.quantity <= 0) { + return await ctx.reply(`У вас нет ресурсов для продажи на предприятии ${enterprise.name}.`) } - const { currentResources, resourceType, playerId } = enterprise; - const resourcePrice = await ResourcePriceModel.findOne({ where: { resource: resourceType } }); - const totalPrice = currentResources * resourcePrice.price; + const salePrice = getResourcePrice(enterprise.resourceType) // Цена за единицу ресурса + const totalSale = salePrice * resourceQuantity.quantity - if (currentResources === 0) { - return await ctx.reply('На предприятии нет ресурсов для продажи.'); - } + // Обновляем количество ресурсов + await ResourceModel.update( + { quantity: 0 }, // Все ресурсы продаются + { where: { playerId: user.telegram_id, type: enterprise.resourceType } } + ) - await ctx.reply( - `Вы уверены, что хотите продать все ${currentResources} ед. ${resourceType} за ${totalPrice} руб.? Это необратимо!\n\nРекомендуем воспользоваться командой /sell для более гибкого управления продажами.`, - Markup.inlineKeyboard([ - [ - { text: '✅ Продать всё', callback_data: `confirm_ressell_${enterpriseId}` }, - { text: '❌ Отмена', callback_data: 'cancel' } - ] - ]) - ); -}); + // Добавляем деньги пользователю + await user.update({ balance: user.balance + totalSale }) -bot.action(/confirm_ressell_(\d+)/, async (ctx) => { - const enterpriseId = ctx.match[1]; - const enterprise = await EnterpriseModel.findByPk(enterpriseId); + return await ctx.reply(`Вы продали все ресурсы с ${enterprise.name} за ${totalSale} монет.`) +}) - if (!enterprise) { - return await ctx.reply('Предприятие не найдено.'); - } - - const { currentResources, resourceType, playerId } = enterprise; - const resourcePrice = await ResourcePriceModel.findOne({ where: { resource: resourceType } }); - const totalPrice = currentResources * resourcePrice.price; - - if (currentResources === 0) { - return await ctx.reply('На предприятии нет ресурсов для продажи.'); - } - - // Обновление баланса игрока - const user = await UserModel.findByPk(playerId); - user.money += totalPrice; - enterprise.currentResources = 0; - - await user.save(); - await enterprise.save(); - // Инфляция: уменьшение цены ресурса - resourcePrice.price = Math.round( - resourcePrice.price * Math.exp(-resourcePrice.fluctuationRate * amount) - ); - - // Гарантируем, что цена не упадет ниже 50% от базовой цены - resourcePrice.price = Math.max(resourcePrice.price, Math.round(resourcePrice.basePrice * 0.5)); - - await resourcePrice.save(); - - await ctx.reply(`Вы успешно продали ${currentResources} ед. ${resourceType} за ${totalPrice} руб.`); -}); - -// Найм грузовика bot.action('hire_truck', async (ctx) => { - const user = await UserModel.findByPk(ctx.from.id); + let user = await UserModel.findByPk(ctx.from.id) + let warehouse = await WarehouseModel.findOne({ where: { playerId: user.telegram_id } }) - // Получаем список предприятий пользователя - const enterprises = await EnterpriseModel.findAll({ - where: { playerId: user.telegram_id } - }); + if (!warehouse) return await ctx.reply(`У вас нет склада для найма грузовиков.`) - if (enterprises.length === 0) { - return await ctx.reply('У вас нет предприятий для найма грузовиков.'); - } - - // Создаем кнопки для выбора предприятия - const buttons = enterprises.map((enterprise) => [ - { text: `Нанять для ${enterprise.name}`, callback_data: `hire_truck_${enterprise.id}` } - ]); - - return await ctx.reply( - 'Выберите предприятие для найма грузовика:', - Markup.inlineKeyboard(buttons).resize() - ); -}); - -// Обработка найма грузовика для выбранного предприятия -bot.action(/hire_truck_(\d+)/, async (ctx) => { - const user = await UserModel.findByPk(ctx.from.id); - const enterpriseId = ctx.match[1]; - - // Находим предприятие - const enterprise = await EnterpriseModel.findByPk(enterpriseId); - - if (!enterprise || enterprise.playerId != user.telegram_id) { - return await ctx.reply('Предприятие не найдено или вам не принадлежит.'); - } - - // Проверяем, есть ли уже грузовик для этого предприятия - const existingTruck = await TruckModel.findOne({ - where: { enterpriseId: enterprise.id } - }); - - if (existingTruck) { - return await ctx.reply(`У вас уже есть грузовик для предприятия ${enterprise.name}.`); - } - - // Создаем новый грузовик - const newTruck = await TruckModel.create({ - enterpriseId: enterprise.id, + // Логика найма грузовика + let truck = await TruckModel.create({ + warehouseId: warehouse.id, capacity: 10, // Начальная вместимость efficiency: 1 // Начальная эффективность - }); - - return await ctx.reply( - `Вы успешно наняли грузовик для предприятия ${enterprise.name}!` - ); -}); + }) + return await ctx.reply(`Вы наняли грузовик для транспортировки ресурсов!`) +}) async function initializePrices() { const resources = [ @@ -978,82 +839,91 @@ setInterval(async () => { } }, 60000) // Обновляем цены каждые 60 секунд -// Функция добычи ресурсов const resourceProduction = async () => { try { - // Получаем все предприятия + // Получаем все предприятия без фильтрации по пользователю const enterprises = await EnterpriseModel.findAll(); for (const enterprise of enterprises) { - const { - id, - efficiency, - warehouseCapacity, - resourceType, - currentResources, - level, - playerId - } = enterprise; + const { id, efficiency, warehouseCapacity, resourceType, playerId, level, currentResources } = enterprise; - // Расчёт добытых ресурсов + // Рассчитываем добычу ресурсов const producedResources = efficiency * level; - // Проверяем ёмкость склада предприятия + // Проверяем, не превышает ли общая сумма ресурсов ёмкость склада if (currentResources + producedResources <= warehouseCapacity) { - enterprise.currentResources += producedResources; + enterprise.currentResources = currentResources + producedResources; await enterprise.save(); - console.log( - `Предприятие ${id}: добыто ${producedResources} единиц ${resourceType}.` - ); + console.log(`Предприятие ${id}: добыто ${producedResources} единиц ${resourceType}.`); } else { console.log(`Предприятие ${id}: склад заполнен.`); } + + // Получаем универсальный склад, если он есть + const Warehouse = await WarehouseModel.findOne({ + where: { playerId: playerId } // Привязка к игроку через playerId + }); + + if (Warehouse) { + const transportableAmount = Math.min( + enterprise.currentResources, + universalWarehouse.remainingCapacity + ); + + if (transportableAmount > 0) { + // Перемещаем ресурсы + enterprise.currentResources -= transportableAmount; + Warehouse.resources[resourceType] = + (Warehouse.resources[resourceType] || 0) + transportableAmount; + + await enterprise.save(); + await Warehouse.save(); + + console.log(`Предприятие ${id}: перевезено ${transportableAmount} единиц ${resourceType} на универсальный склад.`); + } else { + console.log(`Универсальный склад игрока ${playerId} заполнен.`); + } + } } } catch (error) { console.error('Ошибка добычи ресурсов:', error); } }; -// Функция транспортировки ресурсов + +// Запуск функции каждый час +setInterval(resourceProduction, 60 * 60 * 1000); + +// Функция добычи ресурсов const resourceTransportation = async () => { try { - // Получаем все предприятия const enterprises = await EnterpriseModel.findAll(); for (const enterprise of enterprises) { - const { - id, - resourceType, - currentResources, - playerId - } = enterprise; + const { id, resourceType, currentResources, playerId } = enterprise; if (currentResources > 0) { - // Получаем грузовики, привязанные к предприятию - const trucks = await TruckModel.findAll({ - where: { enterpriseId: id } - }); - - if (trucks.length === 0) { - console.log( - `Предприятие ${id}: нет доступных грузовиков для транспортировки.` - ); - continue; - } - - // Получаем универсальный склад игрока + // Получаем склад игрока const warehouse = await WarehouseModel.findOne({ where: { playerId } }); if (!warehouse) { - console.log( - `Предприятие ${id}: у игрока ${playerId} нет универсального склада.` - ); + console.log(`У игрока ${playerId} нет склада.`); continue; } - // Транспортировка ресурсов + // Получаем грузовики, привязанные к этому складу + const trucks = await Truck.findAll({ + where: { warehouseId: warehouse.id } + }); + + if (trucks.length === 0) { + console.log(`На складе ${warehouse.id} нет доступных грузовиков.`); + continue; + } + + // Транспортируем ресурсы let totalTransported = 0; for (const truck of trucks) { const transportableAmount = Math.min( @@ -1064,8 +934,7 @@ const resourceTransportation = async () => { if (transportableAmount > 0) { // Обновляем данные склада - warehouse[resourceType] = - (warehouse[resourceType] || 0) + transportableAmount; + warehouse[resourceType] = (warehouse[resourceType] || 0) + transportableAmount; // Уменьшаем ресурсы на предприятии enterprise.currentResources -= transportableAmount; @@ -1075,22 +944,18 @@ const resourceTransportation = async () => { totalTransported += transportableAmount; - console.log( - `Грузовик ${truck.id} перевёз ${transportableAmount} единиц ${resourceType}.` - ); + console.log(`Грузовик ${truck.id} перевёз ${transportableAmount} единиц ${resourceType}.`); } - // Прекращаем, если ресурсы закончились + // Прекращаем, если на предприятии закончились ресурсы if (enterprise.currentResources === 0) break; } if (totalTransported === 0) { - console.log( - `Предприятие ${id}: склад заполнен, транспортировка невозможна.` - ); + console.log(`Склад ${warehouse.id} заполнен. Ресурсы не перевезены.`); } } else { - console.log(`Предприятие ${id}: нет ресурсов для транспортировки.`); + console.log(`Предприятие ${id} не имеет доступных ресурсов для транспортировки.`); } } } catch (error) { @@ -1104,8 +969,7 @@ const getWarehouseUsedCapacity = (warehouse) => { return resources.reduce((sum, resource) => sum + (warehouse[resource] || 0), 0); }; -// Запускаем процессы каждый час -setInterval(resourceProduction, 60 * 60 * 1000); +// Запускаем процесс транспортировки каждый час setInterval(resourceTransportation, 60 * 60 * 1000); diff --git a/db.js b/db.js index fb56bbc..7e5e226 100644 --- a/db.js +++ b/db.js @@ -7,7 +7,6 @@ const sequelize = new Sequelize( process.env.DB_PASSWORD, // Пароль { host: process.env.DB_HOST, // Хост - port: process.env.DB_PORT, // Порт dialect: 'postgres', // Диалект базы данных logging: false, // Отключение логирования запросов в консоль }