package purchase_wms
|
|
import (
|
"context"
|
"errors"
|
"github.com/shopspring/decimal"
|
"gorm.io/gorm"
|
"strconv"
|
"strings"
|
"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.CompanyID = int(req.SupplierId)
|
operation.Source = req.Source
|
operation.OperationSource = constvar.OperationSource(req.OperationSource)
|
operation.SalesDetailsNumber = req.SalesDetailsNumber
|
warehouse, err := models.NewWarehouseSearch().SetName(req.WarehouseName).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
|
}
|
|
func (s *Server) SrmGetWarehouseInfo(c context.Context, req *SrmGetWarehouseInfoRequest) (*SrmGetWarehouseInfoResponse, error) {
|
warehouses, err := models.NewWarehouseSearch().FindNotTotal()
|
resp := new(SrmGetWarehouseInfoResponse)
|
if err != nil {
|
return resp, err
|
}
|
for _, warehouse := range warehouses {
|
var info SrmWarehouseInfo
|
info.Name = warehouse.Name
|
info.Address = warehouse.Address
|
info.Principal = warehouse.Contacts
|
resp.Info = append(resp.Info, &info)
|
}
|
return resp, nil
|
}
|
|
func (s *Server) SrmGetOperationInfo(c context.Context, req *SrmGetOperationInfoRequest) (*SrmGetOperationInfoResponse, error) {
|
if req.Number == "" && req.SalesDetailsNumber == "" && req.OperationSource == 0 {
|
return nil, errors.New("参数缺失")
|
}
|
operations, err := models.NewOperationSearch().SetSourceNumber(req.Number).
|
SetOperationSource(constvar.OperationSource(req.OperationSource)).
|
SetSalesDetailsNumber(req.SalesDetailsNumber).
|
SetPreload(true).FindNotTotal()
|
if err != nil {
|
return nil, err
|
}
|
srm := make([]*SrmOperation, 0)
|
for _, operation := range operations {
|
var so SrmOperation
|
so.Number = operation.Number
|
index := strings.LastIndex(operation.OperationTypeName, "-")
|
so.WarehouseName = operation.OperationTypeName[:index]
|
so.Status = int64(operation.Status)
|
so.OverTime = operation.CreateTime
|
for _, detail := range operation.Details {
|
s := so
|
s.ProductId = detail.ProductId
|
s.Amount = detail.Amount.IntPart()
|
s.ProductName = detail.Product.Name
|
srm = append(srm, &s)
|
}
|
}
|
var resp = new(SrmGetOperationInfoResponse)
|
resp.Operations = srm
|
return resp, nil
|
}
|