package logic import ( "context" "database/sql" "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 ConfirmPurchaseReceiptLogic struct { ctx context.Context svcCtx *svc.ServiceContext logx.Logger } func NewConfirmPurchaseReceiptLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ConfirmPurchaseReceiptLogic { return &ConfirmPurchaseReceiptLogic{ctx: ctx, svcCtx: svcCtx, Logger: logx.WithContext(ctx)} } func (l *ConfirmPurchaseReceiptLogic) ConfirmPurchaseReceipt(in *pb.ConfirmPurchaseReceiptReq) (*pb.Empty, error) { tenantId := tenantctx.ExtractTenantId(l.ctx) receipt, err := l.svcCtx.ReceiptModel.FindOneByReceiptId(l.ctx, in.ReceiptId) if err != nil { return nil, ErrReceiptNotFound } if receipt.Status == 1 { return nil, ErrReceiptAlreadyConfirmed } receipt.Status = 1 if err := l.svcCtx.ReceiptModel.Update(l.ctx, receipt); err != nil { return nil, err } // Load receipt details and update order detail received_qty + write inventory logs details, err := l.svcCtx.ReceiptDetailModel.FindByReceiptId(l.ctx, in.ReceiptId) if err != nil { return nil, err } var totalQty float64 for _, d := range details { totalQty += d.ActualQty // Update order detail received_qty if err := l.svcCtx.OrderDetailModel.UpdateReceivedQty(l.ctx, d.OrderDetailId, d.ActualQty); err != nil { l.Errorf("update order detail received_qty failed: %v", err) } // Write InventoryLog _, err = l.svcCtx.InventoryLogModel.Insert(l.ctx, &model.InvInventoryLog{ LogId: uid.Generate(), TenantId: tenantId, ProductId: d.ProductId, ChangeQty: d.ActualQty, ChangeType: 1, // purchase receipt RefType: "PURCHASE", RefId: in.ReceiptId, ContactId: receipt.OrderId, LogDate: time.Now(), Operator: tenantId, Remark: sql.NullString{String: receipt.ReceiptNo, Valid: true}, }) if err != nil { l.Errorf("write inventory log failed: %v", err) } } // Update order received_qty and receipt_status if err := l.svcCtx.OrderModel.UpdateReceiptProgress(l.ctx, receipt.OrderId, totalQty); err != nil { l.Errorf("update order receipt progress failed: %v", err) } // Update supplier delivered_qty if order, err := l.svcCtx.OrderModel.FindOneByOrderId(l.ctx, receipt.OrderId); err == nil { if err := l.svcCtx.SupplierModel.UpdateStats(l.ctx, order.SupplierId, 0, 0, 0, totalQty); err != nil { l.Errorf("update supplier delivered_qty failed: %v", err) } } return &pb.Empty{}, nil }