package service import ( "github.com/shopspring/decimal" "time" "wms/constvar" "wms/models" ) type OutputInfo struct { LocationID int WarehouseID int Products []*ProductInfo OperationID int SourceNumber string SaleDetailsNumber string } type ProductInfo struct { ProductID string Amount decimal.Decimal } func AddOutputOperations(outputList []*OutputInfo) (err error) { //查找operationID warehouseIds := make([]int, 0) for _, output := range outputList { warehouseIds = append(warehouseIds, output.WarehouseID) } opTypes, err := models.NewOperationTypeSearch().SetWarehouseIds(warehouseIds).SetBaseOperationType(constvar.BaseOperationTypeOutgoing).FindNotTotal() if err != nil { return err } autoCode, codeStandard, maxAutoIncr, err := GetAutoCode(constvar.CodeStandardType_Outgoing) if err != nil { return err } opTypeMap := make(map[int]*models.OperationType, len(opTypes)) for _, opType := range opTypes { opTypeMap[opType.WarehouseId] = opType } operations := make([]*models.Operation, 0, len(outputList)) for _, output := range outputList { location, err := models.NewLocationSearch().SetType(int(constvar.LocationTypeCustomer)).First() if err != nil { return err } details := make([]*models.OperationDetails, 0, len(output.Products)) for _, product := range output.Products { details = append(details, &models.OperationDetails{ OperationID: 0, ProductId: product.ProductID, Amount: product.Amount, FromLocationID: output.LocationID, ToLocationID: location.Id, }) } if opTypeMap[output.WarehouseID] == nil { continue } operation := &models.Operation{ Id: 0, Number: autoCode, SourceNumber: output.SourceNumber, OperationTypeId: opTypeMap[output.WarehouseID].Id, OperationTypeName: opTypeMap[output.WarehouseID].Name, Status: constvar.OperationStatus_Ready, OperationDate: time.Now().Format("2006-01-02 15:04:05"), ContacterID: 0, ContacterName: "", CompanyID: "", CompanyName: "", Comment: "crm发货申请", LogisticCompanyId: "", LogisticCompany: models.LogisticCompany{}, WaybillNumber: "", Weight: decimal.Decimal{}, LogisticWeight: decimal.Decimal{}, Source: "crm", Details: details, BaseOperationType: constvar.BaseOperationTypeOutgoing, LocationID: output.LocationID, OperationSource: constvar.OperationSourceSaleDelivery, SalesDetailsNumber: output.SaleDetailsNumber, } operations = append(operations, operation) autoCode = models.GetAutoCode(maxAutoIncr, codeStandard) maxAutoIncr++ } return models.NewOperationSearch().CreateBatch(operations) }