Sfoglia il codice sorgente

解决问题:重新配送,配送订单号相同会失败

shizhongqi 11 mesi fa
parent
commit
285099991e
1 ha cambiato i file con 48 aggiunte e 19 eliminazioni
  1. 48 19
      app-hd/controllers/IntraCityController.php

+ 48 - 19
app-hd/controllers/IntraCityController.php

@@ -332,7 +332,6 @@ class IntraCityController extends BaseController
     {
         try {
             $post = Yii::$app->request->post();
-
             $orderId = $post['orderId'];
             $order = OrderClass::getById($orderId);
             if (empty($order)) {
@@ -406,11 +405,21 @@ class IntraCityController extends BaseController
                 'item_list' => $itemList,
             ];
 
+            //生成 store_order_id
+            $storeOrderId = $orderId;
+            if ($post['isNew'] == 0) { // 如果不是首次用 $orderId 创建快递配送,则要生成新 store_order_id
+                // store_order_id 门店订单编号, 即 orderId。如果是重新配送的第n次,订单编号的命名规则为:orderId_copy_n
+                $copyOrderCount = ExpressOrderClass::getCount(['storeOrderId'=>['like', $orderId . '_copy_%']]);
+                $copyOrderCount += 1;
+                $storeOrderId = $orderId . '_copy_' . $copyOrderCount;
+            }
+
+
             $callbackUrl = Yii::$app->params['hdHost'] . '/intra-city/callback';
             $orderData = [
                 //'out_store_id' => $shopId,
                 'wx_store_id' => $shopExt['wxStoreId'],
-                'store_order_id' => $orderId, //同一个门店订单编号要保证唯一,相同的订单号会重入
+                'store_order_id' => $storeOrderId, //同一个门店订单编号要保证唯一,相同的订单号会重入
                 'user_openid' => $user['miniOpenId'],
                 'user_lng' => $post['user_lng'],
                 'user_lat' => $post['user_lat'],
@@ -627,7 +636,7 @@ class IntraCityController extends BaseController
             // 记录回调日志
             Yii::info('同城配送回调:' . json_encode($callbackData, JSON_UNESCAPED_UNICODE));
 
-            $storeOrderId = isset($callbackData['store_order_id']) ? intval($callbackData['store_order_id']) : 0;
+            $storeOrderId = isset($callbackData['store_order_id']) ? $callbackData['store_order_id'] : 0;
             $wxStoreId = $callbackData['wx_store_id'];
 
             // 使用 storeOrderId 与 wxStoreId 去查询 xhExpressOrder 表
@@ -640,51 +649,71 @@ class IntraCityController extends BaseController
                 ]);
                 exit();
             }
+            // 提取 orderId
+            $arr = explode('_', $storeOrderId);
+            $orderId = intval($arr[0]);
 
             $orderStatus = intval($callbackData['order_status']);
             switch ($orderStatus) {
-                case IntraCityExpress::ORDER_STATUS_CREATED: // 订单创建成功
+                // 订单创建成功
+                case IntraCityExpress::ORDER_STATUS_CREATED:
                     $eo->order_status = ExpressOrder::ORDER_STATUS_CREATED;
                     $eo->status = ExpressOrder::STATUS_CREATED;
                     // 更新 xhOrder 表的订单状态与配送状态 -- 配送中|已发货
-                    OrderClass::updateById($storeOrderId, ['status'=>OrderClass::ORDER_STATUS_SENDING, 'sendStatus'=>OrderClass::SEND_STATUS_SENDING]);
+                    OrderClass::updateById($orderId, ['status'=>OrderClass::ORDER_STATUS_SENDING, 'sendStatus'=>OrderClass::SEND_STATUS_SENDING]);
                     break;
-                case IntraCityExpress::ORDER_STATUS_CANCELED_BY_MERCHANT: // 商家取消订单
+
+                // 商家取消订单
+                case IntraCityExpress::ORDER_STATUS_CANCELED_BY_MERCHANT:
                     $eo->order_status = ExpressOrder::ORDER_STATUS_CANCELED_BY_MERCHANT;
                     // 更新 xhOrder 表的订单状态与配送状态 -- 待配送|取消
-                    OrderClass::updateById($storeOrderId, ['status'=>OrderClass::ORDER_STATUS_UN_SEND, 'sendStatus'=>OrderClass::SEND_STATUS_CANCEL]);
+                    OrderClass::updateById($orderId, ['status'=>OrderClass::ORDER_STATUS_UN_SEND, 'sendStatus'=>OrderClass::SEND_STATUS_CANCEL]);
                     break;
-                case IntraCityExpress::ORDER_STATUS_CANCELED_BY_DELIVERY: // 配送方取消订单
+
+                // 配送方取消订单
+                case IntraCityExpress::ORDER_STATUS_CANCELED_BY_DELIVERY:
                     $eo->order_status = ExpressOrder::ORDER_STATUS_CANCELED_BY_DELIVERY;
                     $eo->status = ExpressOrder::STATUS_CANCELED;
                     // 更新 xhOrder 表的订单状态与配送状态 -- 待配送|取消
-                    OrderClass::updateById($storeOrderId, ['status'=>OrderClass::ORDER_STATUS_UN_SEND, 'sendStatus'=>OrderClass::SEND_STATUS_CANCEL]);
+                    OrderClass::updateById($orderId, ['status'=>OrderClass::ORDER_STATUS_UN_SEND, 'sendStatus'=>OrderClass::SEND_STATUS_CANCEL]);
                     break;
-                case IntraCityExpress::ORDER_STATUS_ACCEPTED: // 配送员接单
+
+                // 配送员接单
+                case IntraCityExpress::ORDER_STATUS_ACCEPTED:
                     $eo->order_status = ExpressOrder::ORDER_STATUS_ACCEPTED;
                     // 更新 xhOrder 表的订单状态与配送状态 -- 配送中|已发货
-                    OrderClass::updateById($storeOrderId, ['status'=>OrderClass::ORDER_STATUS_SENDING, 'sendStatus'=>OrderClass::SEND_STATUS_SENDING]); //订单创建时已执行了,这儿重复更新
+                    OrderClass::updateById($orderId, ['status'=>OrderClass::ORDER_STATUS_SENDING, 'sendStatus'=>OrderClass::SEND_STATUS_SENDING]); //订单创建时已执行了,这儿重复更新
                     break;
-                case IntraCityExpress::ORDER_STATUS_ARRIVED: // 配送员到店
+
+                // 配送员到店
+                case IntraCityExpress::ORDER_STATUS_ARRIVED:
                     $eo->order_status = ExpressOrder::ORDER_STATUS_ARRIVED;
                     // 更新 xhOrder 表的订单状态与配送状态 -- 配送中|已发货
-                    OrderClass::updateById($storeOrderId, ['status'=>OrderClass::ORDER_STATUS_SENDING, 'sendStatus'=>OrderClass::SEND_STATUS_SENDING]); //订单创建时已执行了,这儿重复更新
+                    OrderClass::updateById($orderId, ['status'=>OrderClass::ORDER_STATUS_SENDING, 'sendStatus'=>OrderClass::SEND_STATUS_SENDING]); //订单创建时已执行了,这儿重复更新
                     break;
-                case IntraCityExpress::ORDER_STATUS_DELIVERING: // 配送中
+
+                // 配送中
+                case IntraCityExpress::ORDER_STATUS_DELIVERING:
                     $eo->order_status = ExpressOrder::ORDER_STATUS_DELIVERING;
                     break;
-                case IntraCityExpress::ORDER_STATUS_WITHDRAWN: // 配送员撤单
+
+                // 配送员撤单
+                case IntraCityExpress::ORDER_STATUS_WITHDRAWN:
                     $eo->order_status = ExpressOrder::ORDER_STATUS_WITHDRAWN;
                     // 更新 xhOrder 表的订单状态与配送状态 -- 待配送|未发货
-                    OrderClass::updateById($storeOrderId, ['status'=>OrderClass::ORDER_STATUS_UN_SEND, 'sendStatus'=>OrderClass::SEND_STATUS_UNSEND]);
+                    OrderClass::updateById($orderId, ['status'=>OrderClass::ORDER_STATUS_UN_SEND, 'sendStatus'=>OrderClass::SEND_STATUS_UNSEND]);
                     break;
-                case IntraCityExpress::ORDER_STATUS_COMPLETED: // 配送完成
+
+                // 配送完成
+                case IntraCityExpress::ORDER_STATUS_COMPLETED:
                     $eo->order_status = ExpressOrder::ORDER_STATUS_COMPLETED;
                     $eo->status = ExpressOrder::STATUS_COMPLETED;
                     // 更新 xhOrder 表的订单状态与配送状态 -- 已完成|已送达
-                    OrderClass::updateById($storeOrderId, ['status'=>OrderClass::ORDER_STATUS_COMPLETE, 'sendStatus'=>OrderClass::SEND_STATUS_COMPLETED]);
+                    OrderClass::updateById($orderId, ['status'=>OrderClass::ORDER_STATUS_COMPLETE, 'sendStatus'=>OrderClass::SEND_STATUS_COMPLETED]);
                     break;
-                case IntraCityExpress::ORDER_STATUS_EXCEPTION: // 配送异常
+
+                // 配送异常
+                case IntraCityExpress::ORDER_STATUS_EXCEPTION:
                     $eo->order_status = ExpressOrder::ORDER_STATUS_EXCEPTION;
                     noticeUtil::push('同城配送异常 --- store_order_id(orderId):'.$storeOrderId.',wx_store_id:'.$wxStoreId);
                     break;