fix: 本地订单已退款或取消时不再向上游提交采购单

This commit is contained in:
dujiao-next committed 2026-10-11 13:23:13 +08:00
1 parent e5e80de0cf
commit 3e7885b137
2 files changed
+38

No files matched your search

@@ -49,6 +49,11 @@ func (s *Service) SubmitToUpstream(procurementOrderID uint) error {
s.rejectProcurement(procOrder, fmt.Sprintf("local order %d not found", procOrder.LocalOrderID))
return nil // 永久性错误,不重试
}
// 本地订单已退款/取消等不再需要采购(如巡检补投的历史积压单),不能再去上游扣款
if localOrder.Status != constants.OrderStatusPaid && localOrder.Status != constants.OrderStatusFulfilling {
s.rejectProcurement(procOrder, fmt.Sprintf("local order %d status %s no longer needs procurement", localOrder.ID, localOrder.Status))
return nil // 永久性错误,不重试
}
if len(localOrder.Items) == 0 {
s.rejectProcurement(procOrder, fmt.Sprintf("local order %d has no items", localOrder.ID))
return nil // 永久性错误,不重试
@@ -299,3 +299,36 @@ func TestSubmitToUpstream_HTTPErrorWithNonRetryableCode_Rejects(t *testing.T) {
t.Fatalf("expected rejected without retries, got status=%q retry_count=%d", updated.Status, updated.RetryCount)
}
}
// 本地订单已退款时(如巡检补投历史积压单),不能再去上游下单扣款。
func TestSubmitToUpstream_LocalOrderRefunded_RejectsWithoutCallingUpstream(t *testing.T) {
db := setupProcurementTestDB(t)
order := createProcTestOrder(t, db, "PROC-REFUNDED-001", constants.OrderStatusRefunded, constants.FulfillmentTypeUpstream)
pm := &mappingdomain.Mapping{ConnectionID: 1, LocalProductID: 1, UpstreamProductID: 101, IsActive: true}
db.Create(pm)
db.Create(&mappingdomain.SKUMapping{ProductMappingID: pm.ID, LocalSKUID: 1, UpstreamSKUID: 201, UpstreamIsActive: true})
called := false
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
called = true
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(map[string]any{"ok": true, "order_id": 999, "order_no": "UP-999"})
}))
defer server.Close()
connSvc := newTestSiteConnectionService(db, "test-key", t.TempDir())
conn, _ := connSvc.Create(siteconnectionapp.CreateInput{
Name: "test-upstream", BaseURL: server.URL,
ApiKey: "key", ApiSecret: "secret", Protocol: constants.ConnectionProtocolDujiaoNext,
})
proc := createTestProcurementOrder(t, db, conn.ID, order.ID, order.OrderNo, "failed")
if err := newTestProcurementService(db, connSvc).SubmitToUpstream(proc.ID); err != nil {
t.Fatalf("SubmitToUpstream: %v", err)
}
var updated ProcurementOrder
db.First(&updated, proc.ID)
if called || updated.Status != constants.ProcurementStatusRejected {
t.Fatalf("expected rejected without upstream call, got called=%v status=%q", called, updated.Status)
}
}