Просмотр исходного кода

精确配送订单取消原因与异常原因,并发送通知

shizhongqi 7 месяцев назад
Родитель
Сommit
12f7658226

+ 40 - 0
common/components/delivery/platform/dada/CallBackHandler.php

@@ -2,6 +2,8 @@
 
 namespace common\components\delivery\platform\dada;
 
+use biz\common\classes\GhsNotifyClass;
+use biz\common\classes\HdNotifyClass;
 use bizGhs\express\classes\GhsDeliveryOrderClass;
 use bizHd\express\classes\HdDeliveryOrderClass;
 use bizGhs\order\classes\OrderClass;
@@ -100,6 +102,8 @@ class CallBackHandler
                 // 取消/异常 (且当前状态未取消)
                 if (!in_array($order->sendStatus, [-2, -1]) && in_array($sendStatus, [-1, -2])) {
                     OrderClass::cancelOrderSend($order, ['staffId' => 0, 'staffName' => '']);
+                    $event = $this->cancelFrom($sendStatus, $data['cancel_from'], $dadaStatus);
+                    GhsNotifyClass::ptErrorNotify($order->id, $event);
                 }
 
                 $cg = PurchaseClass::getById($order->purchaseId, true, 'id,sendStatus');
@@ -118,6 +122,12 @@ class CallBackHandler
              // 零售订单处理
             util::checkRepeatCommit('hd_pt_' . $order->id . '_' . $sendStatus, 2);
             //$order = HdOrderClass::getById($order->id, true, 'id,sendType,sendStatus,deliveryId,customId,status');
+            // 取消/异常 (且当前状态未取消)
+            if (!in_array($order->sendStatus, [-2, -1]) && in_array($sendStatus, [-1, -2])) {
+                $event = $this->cancelFrom($sendStatus, $data['cancel_from'], $dadaStatus);
+                HdNotifyClass::ptErrorNotify($order->id, $event);
+            }
+
             if ($order) {
                 $order->sendStatus = $sendStatus;
                 if ($orderStatus !== null) {
@@ -212,4 +222,34 @@ class CallBackHandler
          ];
          return $map[$dadaStatus] ?? null;
     }
+
+    private function cancelFrom($sendStatus, $from, $dadaStatus)
+    {
+        if($sendStatus == -1){
+            switch($from){
+                case 1:
+                    $which = '达达配送员取消';
+                    break;
+                case 2:
+                    $which = '商家主动取消';
+                    break;
+                case 3:
+                    $which = '系统或客服取消';
+                    break;
+                default:
+                    $which = '未知';
+
+            }
+            return $which;
+        }
+
+        if($sendStatus == -2){
+            $reasons = [
+                9 => '妥投异常之物品返回中',
+                10 => '妥投异常之物品返回完成',
+                1000 => '创建达达运单失败',
+            ];
+            return $reasons[$dadaStatus] ?? '未知';
+        }
+    }
 }

+ 21 - 0
common/components/delivery/platform/fengniao/CallBackNotify.php

@@ -1,6 +1,8 @@
 <?php
 namespace common\components\delivery\platform\fengniao;
 
+use biz\common\classes\GhsNotifyClass;
+use biz\common\classes\HdNotifyClass;
 use bizGhs\express\classes\DeliveryAuthTokenClass;
 use bizGhs\express\classes\GhsDeliveryOrderClass;
 use bizGhs\order\classes\OrderClass;
@@ -68,6 +70,9 @@ class CallBackNotify
             }
             if (!in_array($order->sendStatus, [-2, -1]) && ($sendStatus == -1 || $sendStatus == -2)) {
                 OrderClass::cancelOrderSend($order, ['staffId' => 0, 'staffName' => '']);
+
+                $event = $this->cancelFrom($sendStatus, $data);
+                GhsNotifyClass::ptErrorNotify($order->id, $event);
             }
 
             $cg = PurchaseClass::getById($order->purchaseId, true, 'id,sendStatus');
@@ -81,6 +86,11 @@ class CallBackNotify
             util::checkRepeatCommit('hd_pt_'.$deliveryOrder->hdOrderId.'_'.$sendStatus, 2); // 防止重复回调
 
             $order = HdOrderClass::getById($deliveryOrder->hdOrderId, true, 'id,sendType,sendStatus,deliveryId,customId,status');
+            if (!in_array($order->sendStatus, [-2, -1]) && ($sendStatus == -1 || $sendStatus == -2)) {
+                $event = $this->cancelFrom($sendStatus, $data);
+                HdNotifyClass::ptErrorNotify($order->id, $event);
+            }
+
             $order->sendStatus = $sendStatus;
             $order->status = $orderStatus;
             $order->save();
@@ -222,4 +232,15 @@ class CallBackNotify
             'orderId' => $orderId
         ], true);
     }
+
+    private function cancelFrom($sendStatus, $data)
+    {
+        if($sendStatus == -1){
+            return $data['description'] ?? '取消';
+        }
+
+        if($sendStatus == -2){
+            return "异常code={$data['error_code']}, 异常描述:{$data['error_scene']}";
+        }
+    }
 }

+ 33 - 0
common/components/delivery/platform/huolala/CallBackHandler.php

@@ -1,6 +1,8 @@
 <?php
 namespace common\components\delivery\platform\huolala;
 
+use biz\common\classes\GhsNotifyClass;
+use biz\common\classes\HdNotifyClass;
 use bizGhs\express\classes\GhsDeliveryOrderClass;
 use bizGhs\order\classes\OrderClass;
 use bizHd\express\classes\HdDeliveryOrderClass;
@@ -71,6 +73,9 @@ class CallBackHandler
                     }
                     if (!in_array($order->sendStatus, [-2, -1]) && ($sendStatus == -1 || $sendStatus == -2)) {
                         OrderClass::cancelOrderSend($order, ['staffId' => 0, 'staffName' => '']);
+
+                        $event = $this->cancelFrom($sendStatus, $eventType);
+                        GhsNotifyClass::ptErrorNotify($order->id, $event);
                     }
 
                     $cg = PurchaseClass::getById($order->purchaseId, true, 'id,sendStatus');
@@ -90,6 +95,11 @@ class CallBackHandler
 
                 $order = HdOrderClass::getById($deliveryOrder->hdOrderId, true, 'id,sendType,sendStatus,deliveryId,customId,status');
                 if ($order) {
+                    if (!in_array($order->sendStatus, [-1, -2]) && ($sendStatus == -1 || $sendStatus == -2)) {
+                        $event = $this->cancelFrom($sendStatus, $eventType);
+                        HdNotifyClass::ptErrorNotify($order->id, $event);
+                    }
+
                     $order->sendStatus = $sendStatus;
                     $order->status = $orderStatus;
                     if (!$order->save()) {
@@ -201,4 +211,27 @@ class CallBackHandler
             'orderId' => $orderId
         ], true);
     }
+
+    private function cancelFrom($sendStatus, $eventType)
+    {
+        if($sendStatus == -1){
+            $reasons = [
+                'order_cancel' => '用户已取消订单',
+                'driver_reject' => '司机接单后拒绝,订单自动取消',
+                'no_load_cancel' => '5天内司机未操作“开始装货”,订单自动取消(测试环境40分钟)',
+                'no_complete_cancel' => '10天内未操作卸货,订单自动取消',
+                'order_timeout' => '订单无司机响应,已自动取消',
+            ];
+            return $reasons[$eventType] ?? '未知';
+        }
+
+        if($sendStatus == -2){
+            $reasons = [
+                'set_order_abnormal' => '异常完成(1、客服点击虚报订单,状态为11;2、用户或者司机申诉账单,客服修改账单为0,状态为2)',
+            ];
+            return $reasons[$eventType] ?? '未知';
+        }
+
+        return '未知';
+    }
 }

+ 36 - 0
common/components/delivery/platform/shansong/OrderStatusCallBack.php

@@ -1,6 +1,8 @@
 <?php
 namespace common\components\delivery\platform\shansong;
 
+use biz\common\classes\GhsNotifyClass;
+use biz\common\classes\HdNotifyClass;
 use bizGhs\express\classes\GhsDeliveryOrderClass;
 use bizGhs\order\classes\OrderClass;
 use bizHd\express\classes\HdDeliveryOrderClass;
@@ -72,6 +74,10 @@ class OrderStatusCallBack
                     }
                     if (!in_array($order->sendStatus, [-2, -1]) && ($sendStatus == -1 || $sendStatus == -2)) {
                         OrderClass::cancelOrderSend($order, ['staffId' => 0, 'staffName' => '']);
+
+                        $abortType = $data['abortType'] ?? null;
+                        $event = $this->cancelFrom($sendStatus, $abortType);
+                        GhsNotifyClass::ptErrorNotify($order->id, $event);
                     }
 
                     $cg = PurchaseClass::getById($order->purchaseId, true, 'id,sendStatus');
@@ -88,6 +94,12 @@ class OrderStatusCallBack
                 $order->status = $orderStatus;
 
                 if ($order) {
+                    if (!in_array($order->sendStatus, [-1, -2]) && ($sendStatus == -1 || $sendStatus == -2)) {
+                        $abortType = $data['abortType'] ?? null;
+                        $event = $this->cancelFrom($sendStatus, $abortType);
+                        HdNotifyClass::ptErrorNotify($order->id, $event);
+                    }
+
                     $order->sendStatus = $sendStatus;
                     $order->save();
                 }
@@ -243,4 +255,28 @@ class OrderStatusCallBack
             'orderId' => $orderId
         ], true);
     }
+
+    private function cancelFrom($sendStatus, $abortType)
+    {
+        if($sendStatus == -1){
+            switch($abortType){
+                case 1:
+                    $which = '客户发起取消';
+                    break;
+                case 3:
+                    $which = '闪送员发起取消';
+                    break;
+                case 10:
+                    $which = '系统自动发起取消';
+                    break;
+                default:
+                    $which = '未知';
+            }
+            return $which;
+        }
+
+        if($sendStatus == -2){
+            return '异常';
+        }
+    }
 }

+ 61 - 7
common/components/delivery/platform/shunfeng/CallBackHandler.php

@@ -1,6 +1,8 @@
 <?php
 namespace common\components\delivery\platform\shunfeng;
 
+use biz\common\classes\GhsNotifyClass;
+use biz\common\classes\HdNotifyClass;
 use bizGhs\express\classes\DeliveryAuthTokenClass;
 use bizGhs\express\classes\GhsDeliveryOrderClass;
 use bizHd\express\classes\HdDeliveryOrderClass;
@@ -126,7 +128,7 @@ class CallBackHandler
             $order = OrderClass::getById($deliveryOrder->ghsOrderId, true, 'id,sendType,sendStatus,deliveryId,purchaseId,customId,status');
             if ($order) {
                 if ($extraHandler) {
-                    call_user_func($extraHandler, $order, $sendStatus, true);
+                    call_user_func($extraHandler, $order, $sendStatus, true, $data);
                 }
 
                 $cg = PurchaseClass::getById($order->purchaseId, true, 'id,sendStatus');
@@ -142,7 +144,7 @@ class CallBackHandler
             $order = HdOrderClass::getById($deliveryOrder->hdOrderId, true, 'id,sendType,sendStatus,deliveryId,customId,status');
             if ($order) {
                 if ($extraHandler) {
-                    call_user_func($extraHandler, $order, $sendStatus, false);
+                    call_user_func($extraHandler, $order, $sendStatus, false, $data);
                 }
 
                 $order->sendStatus = $sendStatus;
@@ -175,7 +177,7 @@ class CallBackHandler
      */
     private function handleOrderComplete($data)
     {
-        return $this->processOrderCallback($data, '顺丰订单完成回调', 'sf_order_id', function($order, $sendStatus, $isGhs) {
+        return $this->processOrderCallback($data, '顺丰订单完成回调', 'sf_order_id', function($order, $sendStatus, $isGhs, $data) {
             if ($isGhs && $sendStatus == 5) {
                 OrderClass::confirmReach($order, ['staffId' => 0, 'staffName' => '']);
             }
@@ -191,9 +193,13 @@ class CallBackHandler
      */
     private function handleSfCancel($data)
     {
-        return $this->processOrderCallback($data, '顺丰取消订单回调', 'sf_order_id', function($order, $sendStatus, $isGhs) {
-            if ($isGhs && !in_array($order->sendStatus, [-2, -1]) && $sendStatus == -1) {
+        return $this->processOrderCallback($data, '顺丰取消订单回调', 'sf_order_id', function($order, $sendStatus, $isGhs, $data) {
+            if ($isGhs && !in_array($order->sendStatus, [-1]) && $sendStatus == -1) {
                 OrderClass::cancelOrderSend($order, ['staffId' => 0, 'staffName' => '']);
+
+                $cancelCode = $data['cancel_code'];
+                $event = $this->cancelFrom($sendStatus, $cancelCode);
+                GhsNotifyClass::ptErrorNotify($order->id, $event);
             }
         });
     }
@@ -207,9 +213,13 @@ class CallBackHandler
      */
     private function handleRiderException($data)
     {
-        return $this->processOrderCallback($data, '顺丰订单异常回调', 'sf_order_id', function($order, $sendStatus, $isGhs) {
-            if ($isGhs && !in_array($order->sendStatus, [-2, -1]) && $sendStatus == -2) {
+        return $this->processOrderCallback($data, '顺丰订单异常回调', 'sf_order_id', function($order, $sendStatus, $isGhs, $data) {
+            if ($isGhs && !in_array($order->sendStatus, [-1]) && $sendStatus == -2) {
                 OrderClass::cancelOrderSend($order, ['staffId' => 0, 'staffName' => '']);
+
+                $exId = $data['ex_id'];
+                $event = $this->cancelFrom($sendStatus, $exId);
+                HdNotifyClass::ptErrorNotify($order->id, $event);
             }
         });
     }
@@ -407,4 +417,48 @@ class CallBackHandler
             'orderId' => $orderId
         ], true);
     }
+
+    private function cancelFrom($sendStatus, $cancelCode = 0)
+    {
+        if($sendStatus == -1){
+            $reasons = [
+                100 => '误操作,抢错订单',
+                101 => '订单距离太远',
+                102 => '餐箱已满,无法配送',
+                103 => '物品过大无法配送',
+                104 => '联系不上寄件人',
+                105 => '寄方无法提供待配送物品(缺货/出餐慢/已配送等)',
+                106 => '寄方要求取消(暂时不需要寄件了/重复发单/信息有误)',
+                107 => '配送车辆故障',
+                108 => '其他,请注明原因',
+                303 => '骑士要求取消',
+                310 => '超出配送范围',
+                500 => '15分钟无人接单',
+                501 => '不兜底订单自动取消',
+                502 => '超期望送达8小时未完成',
+            ];
+            return $reasons[$cancelCode] ?? '未知';
+        }
+
+        if($sendStatus == -2){
+            $exIds = [
+                1001 => '商家出货慢',
+                1007 => '更改取货地址',
+                2001 => '顾客电话无法接通',
+                2004 => '更改期望送达时间',
+                2005 => '顾客拒收',
+                2008 => '顾客不在家',
+                2009 => '更改送货地址',
+                2010 => '顾客拒绝实名认证',
+                2013 => '无法联系用户,退回寄件人',
+                3004 => '实名认证校验失败',
+                4001 => '配送地址错误',
+                4002 => '其他',
+                4003 => '托寄物丢失或损坏',
+            ];
+            return $exIds[$cancelCode] ?? '未知';
+        }
+
+        return '未知';
+    }
 }