Browse Source

零售端-已结算订单不能发起售后

ouyang 1 tuần trước cách đây
mục cha
commit
32be1b5ccf

+ 37 - 0
app-mall/controllers/OrderController.php

@@ -6,7 +6,10 @@ use biz\product\classes\ProductClass;
 use biz\shop\classes\ShopClass;
 use biz\wx\classes\WxMessageClass;
 use bizHd\custom\classes\HdClass;
+use bizHd\distribution\classes\DistributionOrderClass;
 use bizHd\express\classes\HdDeliveryOrderClass;
+use bizHd\order\classes\OrderClass as HdOrderClass;
+use bizHd\refund\classes\MallRefundApplyClass;
 use bizHd\hb\classes\HbClass;
 use bizHd\homePageConfig\classes\HomePageModuleClass;
 use bizHd\order\classes\ScanPayClass;
@@ -1912,9 +1915,43 @@ class OrderController extends BaseController
         $detail['balance'] = $balance;
 
         $detail['rechargeWeal'] = $this->shop->rechargeWeal; //是否开启余额支付
+        // 与 RefundController::canApplyRefund 对齐,供详情页「申请售后」显隐
+        $detail['distOrderSettled'] = DistributionOrderClass::isDistOrderSettled((int)$id) ? 1 : 0;
+        $detail['canApplyRefund'] = $this->canApplyRefundForDetail($detail) ? 1 : 0;
         util::success($detail);
     }
 
+    /**
+     * 订单详情是否可申请售后(与 mall RefundController::canApplyRefund 规则一致)
+     * @param array $order 订单详情
+     * @return bool
+     */
+    protected function canApplyRefundForDetail($order)
+    {
+        if ((int)($order['payStatus'] ?? 0) !== 1) {
+            return false;
+        }
+        $status = (int)($order['status'] ?? 0);
+        if (in_array($status, [HdOrderClass::ORDER_STATUS_UN_PAY, HdOrderClass::ORDER_STATUS_CANCEL, 6], true)) {
+            return false;
+        }
+        if ((int)($order['forward'] ?? 0) === 1) {
+            return false;
+        }
+        $apply = MallRefundApplyClass::getLatestByOrderId((int)($order['id'] ?? 0));
+        if (!empty($apply) && (int)($apply['status'] ?? -1) === MallRefundApplyClass::STATUS_PENDING) {
+            return false;
+        }
+        if (DistributionOrderClass::isDistOrderSettled((int)($order['id'] ?? 0))) {
+            return false;
+        }
+        $could = bcsub((string)($order['orderPrice'] ?? 0), (string)($order['tkPrice'] ?? 0), 2);
+        if (bccomp($could, '0', 2) <= 0) {
+            return false;
+        }
+        return true;
+    }
+
     //获取详情 ssh 20220512
     public function actionInfo()
     {

+ 18 - 11
app-mall/controllers/RefundController.php

@@ -43,17 +43,21 @@ class RefundController extends BaseController
 
         // 分销售后截止提示(仅提示,真正拦截在提交时)
         $refundDeadlineTip = '';
-        $distOrder = DistributionOrderClass::getByCondition(['orderId' => $id]);
-        if (!empty($distOrder)) {
-            $finishTime = $distOrder['finishTime'] ?? '';
-            if (!empty($finishTime) && $finishTime !== '0000-00-00 00:00:00') {
-                $rule = \bizHd\distribution\classes\DistributionRuleClass::getRule(
-                    (int)($order['shopId'] ?? 0),
-                    (int)($order['mainId'] ?? $this->mainId)
-                );
-                $settleDays = max(0, (int)($rule['settleDays'] ?? 0));
-                $deadline = date('Y-m-d H:i', strtotime($finishTime) + $settleDays * 86400);
-                $refundDeadlineTip = "分销订单完成后{$settleDays}天内可申请售后,截止:{$deadline}";
+        if (DistributionOrderClass::isDistOrderSettled($id)) {
+            $refundDeadlineTip = '该订单分销佣金已结算,无法申请售后';
+        } else {
+            $distOrder = DistributionOrderClass::getByCondition(['orderId' => $id]);
+            if (!empty($distOrder)) {
+                $finishTime = $distOrder['finishTime'] ?? '';
+                if (!empty($finishTime) && $finishTime !== '0000-00-00 00:00:00') {
+                    $rule = \bizHd\distribution\classes\DistributionRuleClass::getRule(
+                        (int)($order['shopId'] ?? 0),
+                        (int)($order['mainId'] ?? $this->mainId)
+                    );
+                    $settleDays = max(0, (int)($rule['settleDays'] ?? 0));
+                    $deadline = date('Y-m-d H:i', strtotime($finishTime) + $settleDays * 86400);
+                    $refundDeadlineTip = "分销订单完成后{$settleDays}天内可申请售后,截止:{$deadline}";
+                }
             }
         }
 
@@ -237,6 +241,9 @@ class RefundController extends BaseController
         if (!empty($apply) && (int)($apply['status'] ?? -1) === MallRefundApplyClass::STATUS_PENDING) {
             return 0;
         }
+        if (DistributionOrderClass::isDistOrderSettled((int)($order['id'] ?? 0))) {
+            return 0;
+        }
         $could = bcsub((string)($order['orderPrice'] ?? 0), (string)($order['tkPrice'] ?? 0), 2);
         if (bccomp($could, '0', 2) <= 0) {
             return 0;

+ 21 - 0
biz-hd/distribution/classes/DistributionOrderClass.php

@@ -173,6 +173,24 @@ class DistributionOrderClass extends BaseClass
         return 'invalid';
     }
 
+    /**
+     * 订单是否因 xhDistributionOrder 已结算而不可申请售后
+     * @param int $orderId xhOrder.id
+     * @return bool true=不可申请
+     */
+    public static function isDistOrderSettled($orderId)
+    {
+        $orderId = (int)$orderId;
+        if ($orderId <= 0) {
+            return false;
+        }
+        $distOrder = self::getByCondition(['orderId' => $orderId]);
+        if (empty($distOrder)) {
+            return false;
+        }
+        return (int)($distOrder['settleStatus'] ?? 0) === 1;
+    }
+
     /**
      * 分销关联订单的售后期限校验:订单完成后超过 settleDays 天不可再发起退款
      * 无记录(与分销无关)或不存在 finishTime(尚未完成计佣)则放行
@@ -186,6 +204,9 @@ class DistributionOrderClass extends BaseClass
         if ($orderId <= 0) {
             return;
         }
+        if (self::isDistOrderSettled($orderId)) {
+            util::fail('该订单分销佣金已结算,无法申请售后');
+        }
         $distOrder = self::getByCondition(['orderId' => $orderId]);
         if (empty($distOrder)) {
             return;