Răsfoiți Sursa

Merge branch 'after-sale' into dev

shish 4 săptămâni în urmă
părinte
comite
15d25ac87e

+ 2 - 0
app-ghs/controllers/RefundController.php

@@ -38,6 +38,7 @@ class RefundController extends BaseController
             util::fail('没有找到订单');
         }
         $check = NextDayRefundService::checkEligible($order);
+        $check['hasPayTime'] = NextDayRefundService::hasValidPayTime($order) ? 1 : 0;
         $check['hasNextDay'] = bccomp((string)($order->nextDayTkPrice ?? '0'), '0', 2) > 0 ? 1 : 0;
         $check['nextDayTkPrice'] = $order->nextDayTkPrice ?? '0.00';
         $check['tkPrice'] = $order->tkPrice ?? '0.00';
@@ -47,6 +48,7 @@ class RefundController extends BaseController
         $check['debtPrice'] = $order->debtPrice ?? '0.00';
         $check['remainDebtPrice'] = $order->remainDebtPrice ?? '0.00';
         $check['clearId'] = intval($order->clearId ?? 0);
+        $check['payTime'] = $order->payTime ?? '';
         util::success($check);
     }
 

+ 4 - 3
app-hd/controllers/CgRefundController.php

@@ -85,14 +85,15 @@ class CgRefundController extends BaseController
         if ($cg->status == PurchaseClass::STATUS_CANCEL) {
             util::fail("订单已取消,不能申请售后");
         }
-        // 配对销售单:非当天/已结清走隔天售后,不再拦截「已结不能申请」
+        // 配对销售单:无支付时间不能售后;非当天/已结清走隔天售后
         $saleOrder = OrderClass::getById(intval($cg->saleId ?? 0), true);
         if (empty($saleOrder)) {
             util::fail('没有订单信息');
         }
+        NextDayRefundService::assertCanRefund($saleOrder);
         $forceNextDay = NextDayRefundService::mustUseNextDay($saleOrder);
-        // 保留售后时限:限制花店随意申请(当天/隔天均校验)
-        $payTime = $cg->payTime;
+        // 售后时限只用支付时间
+        $payTime = $saleOrder->payTime;
         $currentTime = strtotime($payTime);
         $now = time();
         $saleHour = $ghsShop->saleHour;

+ 41 - 7
biz-ghs/order/services/NextDayRefundService.php

@@ -30,9 +30,34 @@ class NextDayRefundService
     const FUND_BALANCE = 2;
     const FUND_NONE = 3;
 
+    /**
+     * 是否有有效支付时间(售后唯一时间依据;无支付时间不能售后)
+     */
+    public static function hasValidPayTime($order)
+    {
+        if (empty($order)) {
+            return false;
+        }
+        $payTime = $order->payTime ?? '';
+        return !empty($payTime) && $payTime !== '0000-00-00 00:00:00';
+    }
+
+    /**
+     * 售后入口校验:无支付时间直接拦截
+     */
+    public static function assertCanRefund($order)
+    {
+        if (empty($order)) {
+            util::fail('没有原订单');
+        }
+        if (!self::hasValidPayTime($order)) {
+            util::fail('订单无支付时间,不能售后');
+        }
+    }
+
     /**
      * 原单是否可走隔天冲销(即原「冲销」路径):
-     * - 非当天支付;或
+     * - 非当天支付(仅看 payTime);或
      * - 挂账已结清;或
      * - 已结账单(当天已结账也按冲销处理,不走普通售后)
      * @return array{ok:bool,reason:string,sameDay:int}
@@ -40,13 +65,19 @@ class NextDayRefundService
     public static function checkEligible($order)
     {
         if (empty($order)) {
-            return ['ok' => false, 'reason' => '没有原订单', 'sameDay' => self::SAME_DAY_YES];
+            return ['ok' => false, 'reason' => '没有原订单', 'sameDay' => self::SAME_DAY_YES, 'hasPayTime' => 0];
         }
-        $payTime = $order->payTime ?? ($order->addTime ?? '');
-        $isToday = false;
-        if (!empty($payTime) && $payTime !== '0000-00-00 00:00:00') {
-            $isToday = date('Y-m-d', strtotime($payTime)) === date('Y-m-d');
+        // 只用支付时间;无支付时间本单不能售后(由 assertCanRefund 拦截)
+        if (!self::hasValidPayTime($order)) {
+            return [
+                'ok' => false,
+                'reason' => '订单无支付时间,不能售后',
+                'sameDay' => self::SAME_DAY_YES,
+                'hasPayTime' => 0,
+            ];
         }
+        $payTime = $order->payTime;
+        $isToday = date('Y-m-d', strtotime($payTime)) === date('Y-m-d');
         $debtPrice = bcadd((string)($order->debtPrice ?? '0'), '0', 2);
         $remainDebt = bcadd((string)($order->remainDebtPrice ?? '0'), '0', 2);
         $debtCleared = bccomp($debtPrice, '0', 2) > 0 && bccomp($remainDebt, '0', 2) === 0;
@@ -58,6 +89,7 @@ class NextDayRefundService
                 'ok' => false,
                 'reason' => '当天未结账订单请走普通售后;已结账/挂账结清/隔天可冲销',
                 'sameDay' => self::SAME_DAY_YES,
+                'hasPayTime' => 1,
             ];
         }
         return [
@@ -66,16 +98,18 @@ class NextDayRefundService
             'sameDay' => self::SAME_DAY_NO,
             'suggestFundBalance' => true,
             'orderCleared' => $orderCleared ? 1 : 0,
+            'hasPayTime' => 1,
         ];
     }
 
     /**
      * 创建/审核时是否必须按隔天冲销(sameDay=0):
      * 与 checkEligible 对齐——非当天 / 已结账单 / 挂账已结清,均不可再走当天售后。
+     * 无支付时间返回 false(须先走 assertCanRefund)。
      */
     public static function mustUseNextDay($order)
     {
-        if (empty($order)) {
+        if (!self::hasValidPayTime($order)) {
             return false;
         }
         $check = self::checkEligible($order);

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

@@ -942,6 +942,8 @@ class OrderService extends BaseService
         if (empty($order)) {
             util::fail('没有找到订单');
         }
+        // 无支付时间不能售后
+        \bizGhs\order\services\NextDayRefundService::assertCanRefund($order);
         $sameDay = intval($post['sameDay'] ?? \bizGhs\order\classes\RefundOrderClass::SAME_DAY_YES);
         // 非当天 / 已结账 / 挂账结清 → 强制隔天售后(sameDay=0),不再拦截为「不能售后」
         if (\bizGhs\order\services\NextDayRefundService::mustUseNextDay($order)) {

+ 4 - 0
biz-ghs/order/services/RefundOrderService.php

@@ -55,6 +55,8 @@ class RefundOrderService extends BaseService
         if ($order->status == OrderClass::ORDER_STATUS_CANCEL) {
             util::fail("已取消订单,不能申请售后");
         }
+        // 无支付时间不能售后;仅用 payTime 判是否转隔天
+        NextDayRefundService::assertCanRefund($order);
         // 审核时若已非当天或已结清:自动转为隔天售后(不再要求驳回)
         $sameDay = intval($refund->sameDay ?? RefundOrderClass::SAME_DAY_YES);
         if ($sameDay === RefundOrderClass::SAME_DAY_YES && NextDayRefundService::mustUseNextDay($order)) {
@@ -264,6 +266,8 @@ class RefundOrderService extends BaseService
         $data['customMobile'] = $order->customMobile??'';
         $data['orderTime'] = $order->payTime??'';
 
+        // 无支付时间不能售后
+        NextDayRefundService::assertCanRefund($order);
         // 隔天冲销:sameDay=0 + fundType;非当天/已结清强制冲销(即使创建时未传 sameDay)
         $sameDay = intval($post['sameDay'] ?? RefundOrderClass::SAME_DAY_YES);
         if (NextDayRefundService::mustUseNextDay($order)) {

+ 2 - 0
biz-hd/cg/services/CgRefundService.php

@@ -53,6 +53,8 @@ class CgRefundService extends BaseService
         if (empty($order)) {
             util::fail('没有订单信息');
         }
+        // 无支付时间不能售后;仅用 payTime 判当天/隔天
+        NextDayRefundService::assertCanRefund($order);
 
         // 非当天 / 已结账 / 挂账结清 → 申请即写隔天售后;无资金弹窗时默认返余额
         $sameDay = CgRefundClass::SAME_DAY_YES;