package logic import ( "context" "database/sql" "fmt" "strconv" "time" "muyu-apiserver/model" "muyu-apiserver/pkg/tenantctx" "muyu-apiserver/pkg/uid" "muyu-apiserver/rpc/purchase/internal/svc" "muyu-apiserver/rpc/purchase/pb" "github.com/zeromicro/go-zero/core/logx" ) type CreatePurchaseOrderLogic struct { ctx context.Context svcCtx *svc.ServiceContext logx.Logger } func NewCreatePurchaseOrderLogic(ctx context.Context, svcCtx *svc.ServiceContext) *CreatePurchaseOrderLogic { return &CreatePurchaseOrderLogic{ctx: ctx, svcCtx: svcCtx, Logger: logx.WithContext(ctx)} } func (l *CreatePurchaseOrderLogic) CreatePurchaseOrder(in *pb.CreatePurchaseOrderReq) (*pb.IdResp, error) { tenantId := tenantctx.ExtractTenantId(l.ctx) // Generate order number PO-YYYYMMDD-XXXX today := time.Now().Format("20060102") count, err := l.svcCtx.OrderModel.CountTodayOrders(l.ctx, tenantId, time.Now().Format("2006-01-02")) if err != nil { return nil, err } orderNo := fmt.Sprintf("PO-%s-%04d", today, count+1) orderDate, err := time.Parse("2006-01-02", in.OrderDate) if err != nil { orderDate = time.Now() } // Calculate contract amount from details var contractAmount float64 for _, d := range in.Details { qty, _ := strconv.ParseFloat(d.Quantity, 64) price, _ := strconv.ParseFloat(d.UnitPrice, 64) contractAmount += qty * price } orderId := uid.Generate() _, err = l.svcCtx.OrderModel.Insert(l.ctx, &model.PurPurchaseOrder{ OrderId: orderId, TenantId: tenantId, OrderNo: orderNo, SupplierId: in.SupplierId, OrderDate: orderDate, ContractAmount: contractAmount, PurchaseBy: in.PurchaseBy, Creator: tenantId, Operator: tenantId, Status: 0, // draft Remark: sql.NullString{String: in.Remark, Valid: in.Remark != ""}, }) if err != nil { return nil, err } // Create details details := make([]*model.PurPurchaseOrderDetail, 0, len(in.Details)) for _, d := range in.Details { qty, _ := strconv.ParseFloat(d.Quantity, 64) price, _ := strconv.ParseFloat(d.UnitPrice, 64) details = append(details, &model.PurPurchaseOrderDetail{ DetailId: uid.Generate(), TenantId: tenantId, OrderId: orderId, ProductId: d.ProductId, ProductName: d.ProductName, Spec: d.Spec, Color: d.Color, Quantity: qty, UnitPrice: price, Amount: qty * price, Remark: sql.NullString{String: d.Remark, Valid: d.Remark != ""}, }) } if err := l.svcCtx.OrderDetailModel.BulkInsert(l.ctx, details); err != nil { return nil, err } return &pb.IdResp{Id: orderId}, nil }