package logic import ( "context" "fmt" "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 ListPansLogic struct { ctx context.Context svcCtx *svc.ServiceContext logx.Logger } func NewListPansLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ListPansLogic { return &ListPansLogic{ ctx: ctx, svcCtx: svcCtx, Logger: logx.WithContext(ctx), } } func (l *ListPansLogic) ListPans(in *pb.ListPanReq) (*pb.ListPanResp, error) { product, err := l.svcCtx.ProductModel.FindOneByProductId(l.ctx, in.ProductId) if err != nil { return nil, status.Error(codes.NotFound, "product not found") } pans, err := l.svcCtx.PanModel.FindByProductId(l.ctx, in.ProductId) if err != nil { return nil, status.Error(codes.Internal, err.Error()) } batches, err := l.svcCtx.ProductBatchModel.FindByProductId(l.ctx, product.TenantId, in.ProductId) if err != nil { return nil, status.Error(codes.Internal, err.Error()) } batchNoById := make(map[string]string, len(batches)) for _, b := range batches { batchNoById[b.BatchId] = b.BatchNo } pbPans := make([]*pb.PanInfo, 0, len(pans)) for _, pan := range pans { bolts, err := l.svcCtx.BoltModel.FindByPanId(l.ctx, pan.PanId) if err != nil { return nil, status.Error(codes.Internal, err.Error()) } var panLength float64 pbBolts := make([]*pb.BoltInfo, 0, len(bolts)) for _, b := range bolts { pbBolts = append(pbBolts, &pb.BoltInfo{ BoltId: b.BoltId, PanId: b.PanId, LengthM: fmt.Sprintf("%.2f", b.LengthM), SortOrder: b.SortOrder, }) panLength += b.LengthM } pbPans = append(pbPans, &pb.PanInfo{ PanId: pan.PanId, ProductId: pan.ProductId, BatchId: pan.BatchId, BatchNo: batchNoById[pan.BatchId], Name: pan.Name, Position: pan.Position, SortOrder: pan.SortOrder, Bolts: pbBolts, BoltCount: int64(len(bolts)), TotalLength: fmt.Sprintf("%.2f", panLength), }) } return &pb.ListPanResp{List: pbPans}, nil }