package logic import ( "context" "database/sql" "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 UpdatePurchaseOrderLogic struct { ctx context.Context svcCtx *svc.ServiceContext logx.Logger } func NewUpdatePurchaseOrderLogic(ctx context.Context, svcCtx *svc.ServiceContext) *UpdatePurchaseOrderLogic { return &UpdatePurchaseOrderLogic{ctx: ctx, svcCtx: svcCtx, Logger: logx.WithContext(ctx)} } func (l *UpdatePurchaseOrderLogic) UpdatePurchaseOrder(in *pb.UpdatePurchaseOrderReq) (*pb.Empty, error) { tenantId := tenantctx.ExtractTenantId(l.ctx) order, err := l.svcCtx.OrderModel.FindOneByOrderId(l.ctx, in.OrderId) if err != nil { return nil, ErrOrderNotFound } if order.Status != 0 { return nil, ErrOrderNotDraft } orderDate, err := time.Parse("2006-01-02", in.OrderDate) if err != nil { orderDate = order.OrderDate } var contractAmount float64 for _, d := range in.Details { qty, _ := strconv.ParseFloat(d.Quantity, 64) price, _ := strconv.ParseFloat(d.UnitPrice, 64) contractAmount += qty * price } order.SupplierId = in.SupplierId order.OrderDate = orderDate order.ContractAmount = contractAmount order.PurchaseBy = in.PurchaseBy order.Operator = tenantId order.Remark = sql.NullString{String: in.Remark, Valid: in.Remark != ""} if err := l.svcCtx.OrderModel.Update(l.ctx, order); err != nil { return nil, err } // Replace details if err := l.svcCtx.OrderDetailModel.DeleteByOrderId(l.ctx, in.OrderId); err != nil { return nil, err } 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: in.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.Empty{}, nil }