добавил ручки для фронта

This commit is contained in:
2025-11-30 02:02:11 +03:00
parent da62ea5b98
commit 714844058f
9 changed files with 99 additions and 9 deletions

View File

@@ -28,4 +28,7 @@ type Repository interface {
// FindMatch ищет товар по точному совпадению названия
FindMatch(rawName string) (*uuid.UUID, error)
// GetAllMatches возвращает все существующие привязки
GetAllMatches() ([]ProductMatch, error)
}

View File

@@ -47,3 +47,11 @@ func (r *pgRepository) FindMatch(rawName string) (*uuid.UUID, error) {
return &match.ProductID, nil
}
func (r *pgRepository) GetAllMatches() ([]ocr.ProductMatch, error) {
var matches []ocr.ProductMatch
// Preload("Product") загружает связанную сущность товара,
// чтобы мы видели не только ID, но и название товара из каталога.
err := r.db.Preload("Product").Order("updated_at DESC").Find(&matches).Error
return matches, err
}

View File

@@ -67,7 +67,6 @@ func (s *Service) ProcessReceiptImage(ctx context.Context, imgData []byte) ([]Pr
} else {
// Если не нашли, пробуем найти точное совпадение по имени в каталоге (на всякий случай)
// (В реальном проекте тут может быть нечеткий поиск, но пока точный)
// TODO: Добавить метод FindByName в репозиторий каталога, если нужно
}
processed = append(processed, item)
@@ -118,6 +117,11 @@ func (s *Service) SaveMapping(rawName string, productID uuid.UUID) error {
return s.ocrRepo.SaveMatch(rawName, productID)
}
// GetKnownMatches возвращает список всех обученных связей
func (s *Service) GetKnownMatches() ([]ocr.ProductMatch, error) {
return s.ocrRepo.GetAllMatches()
}
// FindKnownMatch ищет, знаем ли мы уже этот товар
func (s *Service) FindKnownMatch(rawName string) (*uuid.UUID, error) {
return s.ocrRepo.FindMatch(rawName)

View File

@@ -57,3 +57,15 @@ func (h *OCRHandler) SaveMatch(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{"status": "saved"})
}
// GetMatches возвращает список всех обученных связей
func (h *OCRHandler) GetMatches(c *gin.Context) {
matches, err := h.service.GetKnownMatches()
if err != nil {
logger.Log.Error("Ошибка получения списка матчей", zap.Error(err))
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
}
c.JSON(http.StatusOK, matches)
}

View File

@@ -0,0 +1,37 @@
package handlers
import (
"net/http"
"github.com/gin-gonic/gin"
"go.uber.org/zap"
"rmser/internal/services/recommend"
"rmser/pkg/logger"
)
type RecommendationsHandler struct {
service *recommend.Service
}
func NewRecommendationsHandler(service *recommend.Service) *RecommendationsHandler {
return &RecommendationsHandler{service: service}
}
// GetRecommendations godoc
// @Summary Получить список рекомендаций
// @Description Возвращает сгенерированные рекомендации (проблемные зоны учета)
// @Tags recommendations
// @Produce json
// @Success 200 {array} recommendations.Recommendation
// @Failure 500 {object} map[string]string
func (h *RecommendationsHandler) GetRecommendations(c *gin.Context) {
recs, err := h.service.GetRecommendations()
if err != nil {
logger.Log.Error("Ошибка получения рекомендаций", zap.Error(err))
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
}
c.JSON(http.StatusOK, recs)
}