/
NukeFurD
/
Setelment
Обзор
Документация
Войти
/
NukeFurD
/
Setelment
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
app/controllers/analysis_sessions_controller.rb
150 строк
5 KB
SoBAKA
Фикс удаления, честный статус WB, ссылки на парсеры
04 май 2026, 23:53
04 май 2026, 23:53
becda4f
Код
Авторство
О чём код?
class AnalysisSessionsController < ApplicationController def new @session = AnalysisSession.new end def create product_name = params[:product_name].presence if params[:url].present? && params[:url].include?('wildberries') # === Парсинг Wildberries === product_id = WbParser.extract_product_id(params[:url]) if product_id wb_name = WbParser.fetch_product_name(product_id) product_name = wb_name if wb_name.present? product = Product.find_or_create_by(url: params[:url]) do |p| p.name = product_name || "Товар WB #{product_id}" p.source = "Wildberries" p.last_analysis_at = Time.current end # Обновим название если нашлось product.update(name: product_name) if product_name && product.name != product_name @session = product.analysis_sessions.create!( status: :collecting, settings: build_settings, started_at: Time.current ) reviews_data = WbParser.fetch_reviews(product_id) if reviews_data.any? reviews_data.each do |r| @session.reviews.create!( text: r[:text], rating: r[:rating], product: product, processed: false ) end @session.update!(status: :pending, completed_at: Time.current) notice = "Собрано #{reviews_data.size} отзывов с Wildberries" else @session.update!(status: :failed, completed_at: Time.current) notice = nil flash.now[:alert] = "Не удалось получить отзывы. Возможно, товар не найден или API заблокирован." end redirect_to analysis_session_path(@session), notice: notice else # Неверная ссылка product = Product.find_or_create_by(url: params[:url]) do |p| p.name = product_name || "Товар #{Time.current.strftime('%d.%m.%Y')}" p.source = "Неверная ссылка" p.last_analysis_at = Time.current end @session = product.analysis_sessions.create!( status: :failed, settings: build_settings, started_at: Time.current ) redirect_to analysis_session_path(@session), alert: "Не удалось определить ID товара из ссылки." end elsif params[:file].present? # === Загрузка CSV === product = Product.create!( name: product_name || "Загрузка CSV #{Time.current.strftime('%d.%m.%Y')}", source: "CSV файл", last_analysis_at: Time.current ) @session = product.analysis_sessions.create!( status: :pending, settings: build_settings, started_at: Time.current ) count = import_reviews_from_file(@session, params[:file]) redirect_to analysis_session_path(@session), notice: "Загружено #{count} отзывов из CSV" else # Ничего не введено flash.now[:alert] = "Введите ссылку на товар или загрузите CSV-файл." @session = AnalysisSession.new render :new, status: :unprocessable_entity end end def show @session = AnalysisSession.find(params[:id]) @product = @session.product @reviews_count = @session.reviews.count end def report @session = AnalysisSession.find(params[:id]) @product = @session.product @clusters = @session.clusters.includes(:reviews) if @clusters.empty? && @session.reviews.unprocessed.any? # Автоматически запускаем обработку count = Review.process_unprocessed! @clusters = @session.clusters.reload.includes(:reviews) flash.now[:notice] = "Обработано #{count} отзывов" if count > 0 end end def download redirect_to analysis_session_path(params[:id]), notice: "Экспорт будет реализован позже" end private def build_settings { clusters_count: params[:clusters_count]&.to_i || 5, output_format: params[:output_format] || 'pdf', sentiment_method: params[:sentiment_method] || 'auto', sentiment_sensitivity: params[:sentiment_sensitivity] || 'balanced', language: params[:language] || 'auto', ai_summary: params[:ai_summary] == '1' } end def import_reviews_from_file(session, file) require 'csv' count = 0 CSV.foreach(file.path, headers: true) do |row| text = row['text'] || row['review'] || row['content'] next if text.blank? session.reviews.create!( text: text, rating: row['rating']&.to_i, product: session.product, processed: false ) count += 1 end count end end