From 3b5691010051e822af28de2ae4dddc5e200e68ae Mon Sep 17 00:00:00 2001 From: zetaloop Date: Fri, 24 Apr 2026 09:54:34 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E8=AE=A2=E5=8D=95?= =?UTF-8?q?=E7=8A=B6=E6=80=81=E6=9C=BA=E8=BD=AC=E6=8D=A2=E6=A0=A1=E9=AA=8C?= =?UTF-8?q?=E4=B8=8E=E7=BB=93=E7=AE=97=E7=A1=AE=E8=AE=A4=E7=9B=AE=E6=A0=87?= =?UTF-8?q?=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../logic/order/confirmCloseOrderLogic.go | 2 +- app/order/api/internal/logic/order/helpers.go | 31 +++++++++++++++++-- .../api/internal/logic/order/reorderLogic.go | 3 +- 3 files changed, 32 insertions(+), 4 deletions(-) diff --git a/app/order/api/internal/logic/order/confirmCloseOrderLogic.go b/app/order/api/internal/logic/order/confirmCloseOrderLogic.go index 3c5123d..27ed5cc 100644 --- a/app/order/api/internal/logic/order/confirmCloseOrderLogic.go +++ b/app/order/api/internal/logic/order/confirmCloseOrderLogic.go @@ -28,7 +28,7 @@ func NewConfirmCloseOrderLogic(ctx context.Context, svcCtx *svc.ServiceContext) } func (l *ConfirmCloseOrderLogic) ConfirmCloseOrder(req *types.PathId) (resp *types.EmptyResp, err error) { - if err = transitionOrderStatus(l.ctx, l.svcCtx, req.Id, "completed", false, true, true, false); err != nil { + if err = transitionOrderStatus(l.ctx, l.svcCtx, req.Id, "pending_review", false, true, false, false); err != nil { return nil, err } diff --git a/app/order/api/internal/logic/order/helpers.go b/app/order/api/internal/logic/order/helpers.go index da3d14e..47addfa 100644 --- a/app/order/api/internal/logic/order/helpers.go +++ b/app/order/api/internal/logic/order/helpers.go @@ -3,6 +3,8 @@ package order import ( "context" "encoding/json" + "errors" + "fmt" "strconv" "time" @@ -55,13 +57,39 @@ func toAPIOrder(in *orderservice.Orders) types.Order { return order } +// validTransitions defines the allowed order state transitions per the API spec. +var validTransitions = map[string][]string{ + "pending_payment": {"pending_accept"}, + "pending_accept": {"in_progress", "cancelled"}, + "in_progress": {"pending_close", "disputed"}, + "pending_close": {"pending_review", "disputed"}, + "pending_review": {"completed"}, + "disputed": {"pending_review"}, +} + func transitionOrderStatus(ctx context.Context, svcCtx *svc.ServiceContext, orderID int64, toStatus string, setAcceptedAt bool, setClosedAt bool, setCompletedAt bool, setCancelledAt bool) error { current, err := svcCtx.OrderRpc.GetOrdersById(ctx, &orderservice.GetOrdersByIdReq{Id: orderID}) if err != nil { return err } if current.GetOrders() == nil { - return nil + return errors.New("order not found") + } + + fromStatus := current.Orders.GetStatus() + allowed, ok := validTransitions[fromStatus] + if !ok { + return fmt.Errorf("order status %q does not allow any transition", fromStatus) + } + found := false + for _, s := range allowed { + if s == toStatus { + found = true + break + } + } + if !found { + return fmt.Errorf("transition from %q to %q is not allowed", fromStatus, toStatus) } now := time.Now().Unix() @@ -87,7 +115,6 @@ func transitionOrderStatus(ctx context.Context, svcCtx *svc.ServiceContext, orde return err } - fromStatus := current.Orders.GetStatus() actorID, _ := contextj.UserIDFrom(ctx) actorRole := "system" if actorID > 0 { diff --git a/app/order/api/internal/logic/order/reorderLogic.go b/app/order/api/internal/logic/order/reorderLogic.go index e40c51b..ad65cf9 100644 --- a/app/order/api/internal/logic/order/reorderLogic.go +++ b/app/order/api/internal/logic/order/reorderLogic.go @@ -5,6 +5,7 @@ package order import ( "context" + "errors" "time" "juwan-backend/app/order/rpc/orderservice" @@ -37,7 +38,7 @@ func (l *ReorderLogic) Reorder(req *types.PathId) (resp *types.CreateOrderResp, } oldOrder := oldOrderResp.GetOrders() if oldOrder == nil { - return nil, nil + return nil, errors.New("order not found") } now := time.Now().Unix()