package logic import ( "context" "database/sql" "strconv" "muyu-apiserver/model" "muyu-apiserver/pkg/metrics" "muyu-apiserver/pkg/tenantctx" "muyu-apiserver/pkg/uid" "muyu-apiserver/rpc/inventory/internal/svc" "muyu-apiserver/rpc/inventory/pb" "github.com/zeromicro/go-zero/core/logx" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" ) type CreateProductLogic struct { ctx context.Context svcCtx *svc.ServiceContext logx.Logger } func NewCreateProductLogic(ctx context.Context, svcCtx *svc.ServiceContext) *CreateProductLogic { return &CreateProductLogic{ ctx: ctx, svcCtx: svcCtx, Logger: logx.WithContext(ctx), } } func (l *CreateProductLogic) CreateProduct(in *pb.CreateProductReq) (*pb.IdResp, error) { tenantId := tenantctx.ExtractTenantId(l.ctx) productId := uid.Generate() salesPrice, _ := strconv.ParseFloat(in.SalesPrice, 64) product := &model.InvProduct{ ProductId: productId, TenantId: tenantId, ProductName: in.ProductName, ImageUrl: in.ImageUrl, Spec: in.Spec, Color: in.Color, SalesPrice: salesPrice, Remark: sql.NullString{String: in.Remark, Valid: in.Remark != ""}, Status: 1, } _, err := l.svcCtx.ProductModel.Insert(l.ctx, product) if err != nil { return nil, status.Error(codes.Internal, err.Error()) } var totalLengthM float64 var totalBolts int if len(in.Pans) > 0 { pans := make([]*model.InvProductPan, 0, len(in.Pans)) for i, panInput := range in.Pans { panId := uid.Generate() pans = append(pans, &model.InvProductPan{ PanId: panId, ProductId: productId, Name: panInput.Name, Position: panInput.Position, SortOrder: int64(i + 1), }) if len(panInput.BoltLengths) > 0 { bolts := make([]*model.InvProductBolt, 0, len(panInput.BoltLengths)) for j, lengthStr := range panInput.BoltLengths { lengthM, _ := strconv.ParseFloat(lengthStr, 64) totalLengthM += lengthM bolts = append(bolts, &model.InvProductBolt{ BoltId: uid.Generate(), PanId: panId, LengthM: lengthM, SortOrder: int64(j + 1), }) } totalBolts += len(panInput.BoltLengths) if err := l.svcCtx.BoltModel.BulkReplace(l.ctx, panId, "", bolts); err != nil { l.Errorf("create bolts for pan %s failed: %v", panId, err) } } } if err := l.svcCtx.PanModel.BulkReplace(l.ctx, productId, "", pans); err != nil { l.Errorf("create pans for product %s failed: %v", productId, err) } } metrics.ProductCreatedTotal.WithLabelValues(tenantId, in.ProductName, in.Spec, in.Color).Inc() if totalLengthM > 0 { metrics.InboundLengthMetersTotal.WithLabelValues(tenantId, in.ProductName, in.Color, "create").Add(totalLengthM) } if totalBolts > 0 { metrics.InboundBoltsTotal.WithLabelValues(tenantId, "create").Add(float64(totalBolts)) } return &pb.IdResp{Id: productId}, nil }