diff --git a/app/Http/Controllers/Admin/PlatformOrderController.php b/app/Http/Controllers/Admin/PlatformOrderController.php
index 6c876a9..ed7de7b 100644
--- a/app/Http/Controllers/Admin/PlatformOrderController.php
+++ b/app/Http/Controllers/Admin/PlatformOrderController.php
@@ -78,8 +78,7 @@ class PlatformOrderController extends Controller
'plans' => $plans,
'siteSubscription' => $siteSubscription,
'billingCycleLabels' => $this->billingCycleLabels(),
- // order_type label 映射已下沉到 PlatformOrder::orderTypeLabel();这里不再透传 orderTypeLabels
- // 'orderTypeLabels' => $this->orderTypeLabels(),
+ 'orderTypeLabels' => $this->orderTypeLabels(),
'defaults' => $defaults,
]);
}
@@ -91,7 +90,13 @@ class PlatformOrderController extends Controller
$data = $request->validate([
'merchant_id' => ['required', 'integer', 'exists:merchants,id'],
'plan_id' => ['required', 'integer', 'exists:plans,id'],
- 'site_subscription_id' => ['nullable', 'integer', 'exists:site_subscriptions,id'],
+ // 治理口径:续费单必须绑定订阅(否则无法做到“续期/延长到期”这一核心闭环)
+ 'site_subscription_id' => [
+ Rule::requiredIf(fn () => (string) $request->input('order_type') === 'renewal'),
+ 'nullable',
+ 'integer',
+ 'exists:site_subscriptions,id',
+ ],
'order_type' => ['required', Rule::in(array_keys($this->orderTypeLabels()))],
'quantity' => ['required', 'integer', 'min:1', 'max:120'],
'discount_amount' => ['nullable', 'numeric', 'min:0'],
diff --git a/tests/Feature/AdminPlatformOrderCreateDefaultsPreselectedTest.php b/tests/Feature/AdminPlatformOrderCreateDefaultsPreselectedTest.php
index 4e4acb0..3e75b07 100644
--- a/tests/Feature/AdminPlatformOrderCreateDefaultsPreselectedTest.php
+++ b/tests/Feature/AdminPlatformOrderCreateDefaultsPreselectedTest.php
@@ -68,7 +68,8 @@ class AdminPlatformOrderCreateDefaultsPreselectedTest extends TestCase
// 预选 merchant/plan/order_type
$res->assertSee('