iloom/washing-service/internal/service/finished_product_service.go

74 lines
2.0 KiB
Go
Raw Normal View History

package service
import (
"context"
"database/sql"
"fmt"
"time"
"github.com/google/uuid"
"github.com/muyuqingfeng/iloom/shared/pkg/database"
"github.com/muyuqingfeng/iloom/washing-service/internal/model"
"github.com/muyuqingfeng/iloom/washing-service/internal/repository"
)
type FinishedProductService struct {
repo *repository.FinishedProductRepo
db *sql.DB
}
func NewFinishedProductService(repo *repository.FinishedProductRepo, db *sql.DB) *FinishedProductService {
return &FinishedProductService{repo: repo, db: db}
}
func (s *FinishedProductService) List(ctx context.Context, companyID string) ([]model.FinishedProduct, error) {
return s.repo.List(ctx, companyID)
}
func (s *FinishedProductService) Create(ctx context.Context, companyID, userID string, fp *model.FinishedProduct) error {
now := time.Now()
fp.ID = uuid.New().String()
fp.CompanyID = companyID
fp.CreatedBy = &userID
fp.CreatedAt = now
fp.UpdatedAt = now
if fp.Status == "" {
fp.Status = "in_stock"
}
fp.StockMeters = fp.WashedMeters
fp.StockRolls = 0
if fp.Rolls != nil {
fp.StockRolls = *fp.Rolls
}
return database.WithTx(ctx, s.db, func(tx *sql.Tx) error {
return s.repo.Create(ctx, tx, fp)
})
}
func (s *FinishedProductService) Outbound(ctx context.Context, fpID, companyID, userID string, rolls int, meters float64, notes string) error {
return database.WithTx(ctx, s.db, func(tx *sql.Tx) error {
if err := s.repo.UpdateStock(ctx, tx, fpID, -meters, -rolls); err != nil {
return fmt.Errorf("update stock: %w", err)
}
var notePtr *string
if notes != "" {
notePtr = &notes
}
rec := &model.FinishedProductInventoryRecord{
ID: uuid.New().String(),
FinishedProductID: fpID,
CompanyID: companyID,
RecordType: "outbound",
Rolls: rolls,
Meters: meters,
Notes: notePtr,
OperatorID: &userID,
CreatedAt: time.Now(),
}
return s.repo.CreateInventoryRecord(ctx, tx, rec)
})
}