mirror of
https://github.com/serty2005/rmser.git
synced 2026-02-04 19:02:33 -06:00
70 lines
2.3 KiB
Go
70 lines
2.3 KiB
Go
package suppliers
|
||
|
||
import (
|
||
"rmser/internal/domain/suppliers"
|
||
"time"
|
||
|
||
"github.com/google/uuid"
|
||
"gorm.io/gorm"
|
||
"gorm.io/gorm/clause"
|
||
)
|
||
|
||
type pgRepository struct {
|
||
db *gorm.DB
|
||
}
|
||
|
||
func NewRepository(db *gorm.DB) suppliers.Repository {
|
||
return &pgRepository{db: db}
|
||
}
|
||
|
||
func (r *pgRepository) SaveBatch(list []suppliers.Supplier) error {
|
||
if len(list) == 0 {
|
||
return nil
|
||
}
|
||
return r.db.Clauses(clause.OnConflict{
|
||
Columns: []clause.Column{{Name: "id"}},
|
||
UpdateAll: true,
|
||
}).CreateInBatches(list, 100).Error
|
||
}
|
||
|
||
// GetRankedByUsage возвращает поставщиков для конкретного сервера,
|
||
// отсортированных по количеству накладных за последние N дней.
|
||
func (r *pgRepository) GetRankedByUsage(serverID uuid.UUID, daysLookBack int) ([]suppliers.Supplier, error) {
|
||
var result []suppliers.Supplier
|
||
|
||
dateThreshold := time.Now().AddDate(0, 0, -daysLookBack)
|
||
|
||
// SQL: Join Suppliers с Invoices, Group By Supplier, Order By Count DESC
|
||
// Учитываем только активных поставщиков и накладные этого же сервера (через supplier_id + default_store_id косвенно,
|
||
// но лучше явно фильтровать suppliers по rms_server_id).
|
||
// *Примечание:* Invoices пока не имеют поля rms_server_id явно в старой схеме,
|
||
// но мы должны фильтровать Suppliers по serverID.
|
||
|
||
err := r.db.Table("suppliers").
|
||
Select("suppliers.*, COUNT(invoices.id) as usage_count").
|
||
Joins("LEFT JOIN invoices ON invoices.supplier_id = suppliers.id AND invoices.date_incoming >= ?", dateThreshold).
|
||
Where("suppliers.rms_server_id = ? AND suppliers.is_deleted = ?", serverID, false).
|
||
Group("suppliers.id").
|
||
Order("usage_count DESC, suppliers.name ASC").
|
||
Find(&result).Error
|
||
|
||
return result, err
|
||
}
|
||
|
||
func (r *pgRepository) GetByID(id uuid.UUID) (*suppliers.Supplier, error) {
|
||
var supplier suppliers.Supplier
|
||
err := r.db.Where("id = ? AND is_deleted = ?", id, false).First(&supplier).Error
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
return &supplier, nil
|
||
}
|
||
|
||
func (r *pgRepository) Count(serverID uuid.UUID) (int64, error) {
|
||
var count int64
|
||
err := r.db.Model(&suppliers.Supplier{}).
|
||
Where("rms_server_id = ? AND is_deleted = ?", serverID, false).
|
||
Count(&count).Error
|
||
return count, err
|
||
}
|