Browse Source

微信订单确认收货bug

ouyang 1 day ago
parent
commit
3e41fdc0de

+ 39 - 0
biz-hd/order/classes/OrderClass.php

@@ -616,6 +616,45 @@ class OrderClass extends BaseClass
         }
     }
 
+    /**
+     * 顾客确认收货:status 3→4,写 successTime,同步分销完成时间。
+     * api.pt 结算事件也会调用,兜底小程序半屏回调未落库的情况。
+     * @return array{ok:bool,msg:string}
+     */
+    public static function confirmReceiveOrder($orderId, $successTime = null)
+    {
+        $orderId = (int)$orderId;
+        if ($orderId <= 0) {
+            return ['ok' => false, 'msg' => '订单无效'];
+        }
+        $order = self::getById($orderId, true);
+        if (empty($order)) {
+            return ['ok' => false, 'msg' => '没有找到订单'];
+        }
+        if ((int)$order->status === self::ORDER_STATUS_COMPLETE) {
+            return ['ok' => true, 'msg' => '订单已完成'];
+        }
+        if ((int)$order->status !== self::ORDER_STATUS_SENDING) {
+            return ['ok' => false, 'msg' => '当前状态不可确认收货'];
+        }
+        if ((int)$order->payStatus !== 1) {
+            return ['ok' => false, 'msg' => '订单未支付'];
+        }
+
+        $successTime = ($successTime !== null && $successTime !== '') ? $successTime : date('Y-m-d H:i:s');
+        $order->status = self::ORDER_STATUS_COMPLETE;
+        $order->successTime = $successTime;
+        $order->save();
+
+        try {
+            DistributionCommissionClass::onRetailOrderCompleted($orderId, $successTime);
+        } catch (\Throwable $e) {
+            Yii::error('确认收货后分销完成时间同步失败: ' . $e->getMessage(), 'wx-settle');
+        }
+
+        return ['ok' => true, 'msg' => '确认收货成功'];
+    }
+
     //转化出送到时间 ssh 2020.3.15
     public static function getReachTime($order)
     {

+ 12 - 0
biz-mall/order/classes/WxFreezeBalanceClass.php

@@ -299,6 +299,18 @@ class WxFreezeBalanceClass
         if (!empty($order)) {
             self::backfillThirdOrderIdIfEmpty($order, $transactionId);
             $orderId = (int)$order->id;
+            $confirmReceiveTime = self::formatWxEventTime(trim((string)($postObj->confirm_receive_time ?? '')));
+            // 微信已确认收货(含自动确认):兜底把本地 status 置为已完成,避免仅依赖小程序半屏回调
+            if ($confirmReceiveTime !== '' || $settlementTime !== '') {
+                try {
+                    HdOrderClass::confirmReceiveOrder(
+                        $orderId,
+                        $confirmReceiveTime !== '' ? $confirmReceiveTime : $settlementTime
+                    );
+                } catch (\Throwable $e) {
+                    Yii::error('结算事件补本地确认收货失败: ' . $e->getMessage(), 'wx-settle');
+                }
+            }
             if ($settlementTime === '') {
                 OrderWxExtClass::markEstimatedSettlement($orderId, $estimatedTime);
                 return;