package purchase_wms
|
|
import (
|
"context"
|
"github.com/shopspring/decimal"
|
"gorm.io/gorm"
|
"strconv"
|
"time"
|
"wms/constvar"
|
"wms/models"
|
"wms/pkg/timex"
|
)
|
|
type Server struct {
|
UnimplementedPurchaseServiceServer
|
}
|
|
func (s *Server) PurchaseToWms(c context.Context, req *PurchaseToWmsRequest) (*PurchaseToWmsResponse, error) {
|
var operation models.Operation
|
var details []*models.OperationDetails
|
operation.SourceNumber = req.Number
|
operation.OperationDate = timex.TimeToString2(time.Now())
|
operation.Number = strconv.FormatInt(time.Now().Unix(), 10)
|
operation.Status = constvar.OperationStatus_Ready
|
operation.CompanyName = req.SupplierName
|
operation.Source = req.Source
|
warehouse, err := models.NewWarehouseSearch().First()
|
if err != nil {
|
return nil, err
|
}
|
operationType, err := models.NewOperationTypeSearch().SetWarehouseId(warehouse.Id).SetBaseOperationType(constvar.BaseOperationTypeIncoming).First()
|
if err != nil {
|
return nil, err
|
}
|
operation.OperationTypeName = operationType.Name
|
operation.OperationTypeId = operationType.Id
|
location, err := models.NewLocationSearch().SetID(warehouse.LocationId).First()
|
if err != nil {
|
return nil, err
|
}
|
first, err := models.NewLocationSearch().SetType(int(constvar.LocationTypeVendor)).First()
|
if err != nil {
|
return nil, err
|
}
|
operation.LocationID = location.Id
|
operation.BaseOperationType = constvar.BaseOperationTypeIncoming
|
for _, product := range req.Product {
|
var detail models.OperationDetails
|
detail.ProductId = product.Id
|
detail.Amount = decimal.NewFromInt(product.Amount)
|
detail.FromLocationID = first.Id
|
detail.ToLocationID = location.Id
|
details = append(details, &detail)
|
}
|
err = models.WithTransaction(func(db *gorm.DB) error {
|
err := models.NewOperationSearch().SetOrm(db).Create(&operation)
|
if err != nil {
|
return err
|
}
|
for _, detail := range details {
|
detail.OperationID = operation.Id
|
}
|
err = models.NewOperationDetailsSearch().SetOrm(db).CreateBatch(details)
|
return err
|
})
|
if err != nil {
|
return nil, err
|
}
|
resp := new(PurchaseToWmsResponse)
|
resp.Warehouse = warehouse.Name
|
return resp, nil
|
}
|