package inventory_order import ( "context" "errors" "github.com/shopspring/decimal" "strconv" "time" "wms/constvar" "wms/models" "wms/pkg/timex" ) type Server struct { UnimplementedInventoryOrderServiceServer } func (s *Server) CreateOperationList(ctx context.Context, req *CreateOperationListRequest) (*CreateOperationListResponse, error) { var operations []*models.Operation id := 0 if req.WarehouseId != "" { id, _ = strconv.Atoi(req.WarehouseId) } warehouse, err := models.NewWarehouseSearch().SetID(id).First() if err != nil { return nil, err } fromLocation, err := models.NewLocationSearch().SetID(warehouse.LocationId).First() if err != nil { return nil, err } toLocation, err := models.NewLocationSearch().SetType(int(constvar.LocationTypeCustomer)).First() if err != nil { return nil, err } tp := constvar.BaseOperationTypeOutgoing if req.OperationType == 1 { tp = constvar.BaseOperationTypeIncoming fromLocation, err = models.NewLocationSearch().SetType(int(constvar.LocationTypeVendor)).First() if err != nil { return nil, err } toLocation, err = models.NewLocationSearch().SetID(warehouse.LocationId).First() if err != nil { return nil, err } } operationType, err := models.NewOperationTypeSearch().SetWarehouseId(warehouse.Id).SetBaseOperationType(tp).First() if err != nil { return nil, err } operationResp := make([]*OperationResponse, 0) for _, list := range req.List { var operation models.Operation var details []*models.OperationDetails var or OperationResponse operation.SourceNumber = list.SourceNumber operation.SalesDetailsNumber = list.SalesDetailsNumber operation.OperationDate = timex.TimeToString2(time.Now()) operation.Number = strconv.FormatInt(time.Now().Unix(), 10) operation.Status = constvar.OperationStatus_Ready operation.OperationTypeName = operationType.Name operation.OperationTypeId = operationType.Id operation.BaseOperationType = constvar.BaseOperationTypeOutgoing operation.Source = req.Source operation.OperationSource = constvar.OperationSource(req.OperationSource) operation.LocationID = fromLocation.Id if req.OperationType == 1 { operation.LocationID = toLocation.Id } or.WorkOrderId = operation.SourceNumber or.Number = operation.Number operationResp = append(operationResp, &or) if req.OperationType == 1 { operation.BaseOperationType = constvar.BaseOperationTypeIncoming } for _, product := range list.Products { var detail models.OperationDetails detail.ProductId = product.ProductNumber detail.Amount = decimal.NewFromInt(product.Amount) detail.FromLocationID = fromLocation.Id detail.ToLocationID = toLocation.Id details = append(details, &detail) } operation.Details = details operations = append(operations, &operation) } err = models.NewOperationSearch().CreateBatch(operations) resp := new(CreateOperationListResponse) resp.List = operationResp return resp, err } func (s *Server) GetWarehouseInfo(ctx context.Context, req *GetWarehouseInfoRequest) (*GetWarehouseInfoResponse, error) { warehouses, err := models.NewWarehouseSearch().FindNotTotal() if err != nil { return nil, err } list := make([]*WarehouseInfo, 0) for _, warehouse := range warehouses { var wi WarehouseInfo wi.Id = strconv.Itoa(warehouse.Id) wi.Name = warehouse.Name list = append(list, &wi) } resp := new(GetWarehouseInfoResponse) resp.List = list return resp, nil } func (s *Server) GetOperationInfo(ctx context.Context, req *GetOperationInfoRequest) (*GetOperationInfoResponse, error) { if len(req.SourceNumber) == 0 && len(req.SalesDetailsNumber) == 0 { return nil, errors.New("来源编码和销售明细编码不能同时为空") } operations, err := models.NewOperationSearch().SetSourceNumbers(req.SourceNumber).SetSalesDetailsNumbers(req.SalesDetailsNumber). SetStatus(constvar.OperationStatus(req.Status)).SetPreload(true).FindNotTotal() if err != nil { return nil, err } resp := new(GetOperationInfoResponse) list := make([]*OperationInfo, 0) for _, operation := range operations { var ol OperationInfo ol.SourceNumber = operation.SourceNumber ol.SalesDetailsNumber = operation.SalesDetailsNumber for _, detail := range operation.Details { o := ol o.ProductId = detail.ProductId o.Amount = detail.Amount.IntPart() list = append(list, &o) } } resp.List = list return resp, nil }