mirror of
https://github.com/serty2005/rmser.git
synced 2026-02-04 19:02:33 -06:00
добавил ручки для фронта
This commit is contained in:
@@ -28,4 +28,7 @@ type Repository interface {
|
||||
|
||||
// FindMatch ищет товар по точному совпадению названия
|
||||
FindMatch(rawName string) (*uuid.UUID, error)
|
||||
|
||||
// GetAllMatches возвращает все существующие привязки
|
||||
GetAllMatches() ([]ProductMatch, error)
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
37
internal/transport/http/handlers/recommendations.go
Normal file
37
internal/transport/http/handlers/recommendations.go
Normal 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)
|
||||
}
|
||||
Reference in New Issue
Block a user