mirror of
https://github.com/serty2005/rmser.git
synced 2026-02-05 03:12:34 -06:00
Перевел на multi-tenant
Добавил поставщиков Накладные успешно создаются из фронта
This commit is contained in:
60
internal/infrastructure/repository/suppliers/postgres.go
Normal file
60
internal/infrastructure/repository/suppliers/postgres.go
Normal file
@@ -0,0 +1,60 @@
|
||||
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) 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
|
||||
}
|
||||
Reference in New Issue
Block a user