muyu-apiserver/rpc/purchase/internal/logic/getpurchasestatsbysupplierlogic.go

68 lines
1.8 KiB
Go
Raw Permalink Normal View History

package logic
import (
"context"
"fmt"
"muyu-apiserver/pkg/tenantctx"
"muyu-apiserver/rpc/purchase/internal/svc"
"muyu-apiserver/rpc/purchase/pb"
"github.com/zeromicro/go-zero/core/logx"
)
type GetPurchaseStatsBySupplierLogic struct {
ctx context.Context
svcCtx *svc.ServiceContext
logx.Logger
}
func NewGetPurchaseStatsBySupplierLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetPurchaseStatsBySupplierLogic {
return &GetPurchaseStatsBySupplierLogic{ctx: ctx, svcCtx: svcCtx, Logger: logx.WithContext(ctx)}
}
func (l *GetPurchaseStatsBySupplierLogic) GetPurchaseStatsBySupplier(in *pb.PurchaseStatsSummaryReq) (*pb.PurchaseStatsBySupplierResp, error) {
tenantId := tenantctx.ExtractTenantId(l.ctx)
orders, _, err := l.svcCtx.OrderModel.FindList(l.ctx, tenantId, 1, 10000, "", -1, in.StartDate, in.EndDate)
if err != nil {
return nil, err
}
type supplierStats struct {
purchaseAmount float64
paidAmount float64
orderCount int64
}
statsMap := map[string]*supplierStats{}
for _, o := range orders {
if o.Status == 2 {
continue
}
s := statsMap[o.SupplierId]
if s == nil {
s = &supplierStats{}
statsMap[o.SupplierId] = s
}
s.purchaseAmount += o.ContractAmount
s.paidAmount += o.PaidAmount
s.orderCount++
}
items := make([]*pb.PurchaseStatsBySupplierItem, 0, len(statsMap))
for supplierId, s := range statsMap {
name := ""
if sup, err := l.svcCtx.SupplierModel.FindOneBySupplierId(l.ctx, supplierId); err == nil {
name = sup.SupplierName
}
items = append(items, &pb.PurchaseStatsBySupplierItem{
SupplierId: supplierId,
SupplierName: name,
PurchaseAmount: fmt.Sprintf("%.2f", s.purchaseAmount),
PaidAmount: fmt.Sprintf("%.2f", s.paidAmount),
OrderCount: s.orderCount,
})
}
return &pb.PurchaseStatsBySupplierResp{List: items}, nil
}