shish 1 день назад
Родитель
Сommit
bdbc4bf950
2 измененных файлов с 48 добавлено и 0 удалено
  1. 46 0
      biz-ghs/order/classes/OrderClass.php
  2. 2 0
      biz-ghs/order/services/OrderService.php

+ 46 - 0
biz-ghs/order/classes/OrderClass.php

@@ -486,6 +486,52 @@ class OrderClass extends BaseClass
         PurchaseClass::rollbackProductStock($oldStocks, $shop, $adminId, $mainId, '系统');
     }
 
+    /**
+     * 售后提交前确保订单已完成:未完成则走确认送达/完成(与 actionConfirmReach 同口径)
+     * 前端发起售后可直接进页,不再预调确认送达;真正提交时由本方法兜底。
+     *
+     * @param object $order 已加锁的销售单
+     * @param array $params staffId/staffName 或 shopAdminId/shopAdminName
+     * @return object 完成后的订单(重新加锁)
+     */
+    public static function ensureCompletedForRefund($order, $params = [])
+    {
+        if (empty($order)) {
+            util::fail('没有找到订单');
+        }
+        $status = intval($order->status ?? 0);
+        if ($status === self::ORDER_STATUS_COMPLETE) {
+            return $order;
+        }
+        if ($status === self::ORDER_STATUS_UN_PAY) {
+            util::fail('订单待付款,不能售后');
+        }
+        if ($status === self::ORDER_STATUS_CANCEL) {
+            util::fail('订单已取消,不能售后');
+        }
+        // 跑腿进行中不可强制完成,与确认送达接口一致
+        $sendStatus = intval($order->sendStatus ?? 0);
+        if (!in_array($sendStatus, [-1, -4, -2], true)) {
+            util::fail('已经叫跑腿了,等跑腿送完再售后');
+        }
+        $staffParams = [
+            'staffId' => $params['staffId'] ?? ($params['shopAdminId'] ?? 0),
+            'staffName' => $params['staffName'] ?? ($params['shopAdminName'] ?? ''),
+            // 售后自动完成:不额外推送发货通知
+            'notice' => false,
+        ];
+        self::confirmReach($order, $staffParams);
+        $orderId = intval($order->id ?? 0);
+        $fresh = self::getLockById($orderId);
+        if (empty($fresh)) {
+            util::fail('确认完成后未找到订单');
+        }
+        if (intval($fresh->status ?? 0) !== self::ORDER_STATUS_COMPLETE) {
+            util::fail('订单未能完成,请先确认送达后再售后');
+        }
+        return $fresh;
+    }
+
     //订单发货主方法 ssh 20231119
     public static function orderSend($order, $params, $allowRepeat = false)
     {

+ 2 - 0
biz-ghs/order/services/OrderService.php

@@ -934,6 +934,8 @@ class OrderService extends BaseService
         if (empty($order)) {
             util::fail('没有找到订单');
         }
+        // 未完成订单:先确认送达/完成,再继续售后(前端不再预确认)
+        $order = OrderClass::ensureCompletedForRefund($order, $post);
         // 无支付时间不能售后
         \bizGhs\order\services\NextDayRefundService::assertCanRefund($order);
         $sameDay = intval($post['sameDay'] ?? \bizGhs\order\classes\RefundOrderClass::SAME_DAY_YES);