2701-как будто ок днд работает

This commit is contained in:
2026-01-27 12:09:54 +03:00
parent de4bd9c8d7
commit 1e2d43be8e
13 changed files with 10257 additions and 175 deletions

View File

@@ -91,6 +91,10 @@ type Repository interface {
Update(draft *DraftInvoice) error
UpdateItem(itemID uuid.UUID, updates map[string]interface{}) error
UpdateItemOrder(itemID uuid.UUID, newOrder int) error
ReorderItems(draftID uuid.UUID, items []struct {
ID uuid.UUID
Order int
}) error
CreateItem(item *DraftInvoiceItem) error
DeleteItem(itemID uuid.UUID) error
Delete(id uuid.UUID) error

View File

@@ -1,6 +1,8 @@
package drafts
import (
"fmt"
"rmser/internal/domain/drafts"
"github.com/google/uuid"
@@ -105,6 +107,35 @@ func (r *pgRepository) UpdateItemOrder(itemID uuid.UUID, newOrder int) error {
Update("order", newOrder).Error
}
// ReorderItems обновляет порядок нескольких элементов в одной транзакции
func (r *pgRepository) ReorderItems(draftID uuid.UUID, items []struct {
ID uuid.UUID
Order int
}) error {
return r.db.Transaction(func(tx *gorm.DB) error {
for _, item := range items {
// Проверяем, что элемент принадлежит указанному черновику
var count int64
if err := tx.Model(&drafts.DraftInvoiceItem{}).
Where("id = ? AND draft_id = ?", item.ID, draftID).
Count(&count).Error; err != nil {
return err
}
if count == 0 {
return fmt.Errorf("элемент с id %s не принадлежит черновику %s", item.ID.String(), draftID.String())
}
// Обновляем только колонку order
if err := tx.Model(&drafts.DraftInvoiceItem{}).
Where("id = ?", item.ID).
Update("order", item.Order).Error; err != nil {
return err
}
}
return nil
})
}
func (r *pgRepository) Delete(id uuid.UUID) error {
return r.db.Delete(&drafts.DraftInvoice{}, id).Error
}

View File

@@ -921,3 +921,32 @@ func (s *Service) ReorderItem(draftID, itemID uuid.UUID, newOrder int) error {
// Обновляем порядок целевого элемента
return s.draftRepo.UpdateItemOrder(itemID, newOrder)
}
// ReorderItems обновляет порядок нескольких элементов в черновике
func (s *Service) ReorderItems(draftID uuid.UUID, items []struct {
ID uuid.UUID
Order int
}) error {
// Проверяем, что черновик существует
draft, err := s.draftRepo.GetByID(draftID)
if err != nil {
return fmt.Errorf("черновик не найден: %w", err)
}
// Проверяем, что все элементы принадлежат указанному черновику
for _, item := range items {
found := false
for _, draftItem := range draft.Items {
if draftItem.ID == item.ID {
found = true
break
}
}
if !found {
return fmt.Errorf("элемент с id %s не принадлежит черновику %s", item.ID.String(), draftID.String())
}
}
// Вызываем метод репозитория для обновления порядка
return s.draftRepo.ReorderItems(draftID, items)
}

View File

@@ -1,6 +1,7 @@
package handlers
import (
"fmt"
"net/http"
"time"
@@ -73,6 +74,14 @@ type UpdateItemDTO struct {
EditedField string `json:"edited_field"` // "quantity", "price", "sum"
}
// ReorderItemsRequest DTO для переупорядочивания нескольких элементов
type ReorderItemsRequest struct {
Items []struct {
ID string `json:"id"`
Order int `json:"order"`
} `json:"items"`
}
func (h *DraftsHandler) AddDraftItem(c *gin.Context) {
draftID, err := uuid.Parse(c.Param("id"))
if err != nil {
@@ -303,14 +312,9 @@ func (h *DraftsHandler) DeleteDraft(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{"status": newStatus, "id": id.String()})
}
// ReorderItems изменяет порядок позиции в черновике
// ReorderItems изменяет порядок нескольких позиций в черновике
func (h *DraftsHandler) ReorderItems(c *gin.Context) {
type ReorderRequest struct {
ItemID uuid.UUID `json:"item_id" binding:"required"`
NewOrder int `json:"new_order" binding:"required"`
}
var req ReorderRequest
var req ReorderItemsRequest
if err := c.ShouldBindJSON(&req); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
@@ -323,7 +327,27 @@ func (h *DraftsHandler) ReorderItems(c *gin.Context) {
return
}
if err := h.service.ReorderItem(draftID, req.ItemID, req.NewOrder); err != nil {
// Преобразуем элементы в формат для сервиса
items := make([]struct {
ID uuid.UUID
Order int
}, len(req.Items))
for i, item := range req.Items {
id, err := uuid.Parse(item.ID)
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": fmt.Sprintf("invalid item id: %s", item.ID)})
return
}
items[i] = struct {
ID uuid.UUID
Order int
}{
ID: id,
Order: item.Order,
}
}
if err := h.service.ReorderItems(draftID, items); err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
}