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 }