package logic import ( "context" "sort" "lone-services/pkg/utils" "lone-services/pkg/validate" product "lone-services/rpc/product/pb" "lone-services/services/product/internal/model" "lone-services/services/product/internal/svc" "lone-services/services/product/validator" "github.com/zeromicro/go-zero/core/logx" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" "google.golang.org/protobuf/types/known/emptypb" "gorm.io/gorm" ) type NumberItemsLogic struct { ctx context.Context svcCtx *svc.ServiceContext logx.Logger } func NewNumberItemsLogic(ctx context.Context, svcCtx *svc.ServiceContext) *NumberItemsLogic { return &NumberItemsLogic{ ctx: ctx, svcCtx: svcCtx, Logger: logx.WithContext(ctx), } } func (l *NumberItemsLogic) NumberItems(in *product.NumberItemsReq) (*emptypb.Empty, error) { var req validator.ProductNumberItemsValidator if msg := validate.ValidateFromProto(in, &req); msg != utils.StringEmpty { return nil, status.Error(codes.InvalidArgument, msg) } if len(in.GetItems()) < 1 { return nil, status.Error(codes.InvalidArgument, "产品列表不能为空") } items := make([]*product.NumberItem, 0, len(in.GetItems())) for _, item := range in.GetItems() { if item == nil { continue } if item.GetId() < 1 { return nil, status.Error(codes.InvalidArgument, "产品ID必须大于0") } if item.GetNumber() < 1 { return nil, status.Error(codes.InvalidArgument, "数量必须大于0") } items = append(items, item) } if len(items) < 1 { return nil, status.Error(codes.InvalidArgument, "产品列表不能为空") } sort.Slice(items, func(i, j int) bool { return items[i].GetId() < items[j].GetId() }) err := l.svcCtx.DB.WithContext(l.ctx).Transaction(func(tx *gorm.DB) error { m := model.ProductModel{}.Init().WithTX(tx) for _, item := range items { if err := changeProductNumber(l.Logger, m, item.GetId(), req.Type, item.GetNumber()); err != nil { return err } } return nil }) if err != nil { return nil, err } return &emptypb.Empty{}, nil }