shish 10 месяцев назад
Родитель
Сommit
d12b728bdb

+ 99 - 52
app-ghs/controllers/IntraCityController.php

@@ -699,84 +699,131 @@ class IntraCityController extends BaseController
             }
             $orderId = $eo->orderId ?? 0;
             if (empty($orderId)) {
+                $errRemind = '订单号为空,store_order_id: ' . $storeOrderId . ',wx_store_id: ' . $wxStoreId;
+                Yii::error($errRemind, 'intracity');
+                noticeUtil::push($errRemind, '15280215347');
                 return $this->asJson(['return_code' => 1, 'return_msg' => '系统错误2']);
             }
+            $order = OrderClass::getById($orderId, true, 'id, mainId, sendStatus,status');
+            if (empty($order)) {
+                $errRemind = '没有找到订单,store_order_id: ' . $storeOrderId . ',wx_store_id: ' . $wxStoreId;
+                Yii::error($errRemind, 'intracity');
+                noticeUtil::push($errRemind, '15280215347');
+                return $this->asJson(['return_code' => 1, 'return_msg' => '系统错误3']);
+            }
+            $orderStatus = intval($callbackData['order_status']);
+
+            //同个配送单,同个状态的,5秒内不允许重复请求,重要勿删
+            $uniqueId = $storeOrderId . '_' . $orderStatus;
+            util::checkRepeatCommit($uniqueId, 5);
+
             // ====================== 开启事务
             $tx = Yii::$app->db->beginTransaction();
             $msg = ''; // 发通知的内容(默认为空,根据情况生成。没有内容则不会发通知)
-            $orderStatus = intval($callbackData['order_status']);
             switch ($orderStatus) {
-                // 订单创建成功
+                // 订单创建成功,已叫跑腿,等跑腿接单
                 case IntraCityExpress::ORDER_STATUS_CREATED:
-                    $eo->orderStatus = 1;
-                    // 更新 xhOrder 表的订单状态与配送状态 -- 配送中|已发货
-                    OrderClass::updateById($orderId, ['status' => 3, 'sendStatus' => 0]);
-                    break;
-
-                // 商家取消订单
-                case IntraCityExpress::ORDER_STATUS_CANCELED_BY_MERCHANT:
-                    $eo->orderStatus = 2;
-                    // 更新 xhOrder 表的订单状态与配送状态 -- 待配送|取消
-                    OrderClass::updateById($orderId, ['status' => 2, 'sendStatus' => 3]);
-                    $msg = '取消配送,订单编号 ';
+                    if ($order->status == 2) {
+                        $eo->orderStatus = 1;//已叫跑腿,等跑腿接单
+                        $eo->save();
+                        $order->sendStatus = 0;//已叫跑腿,等跑腿接单
+                        $order->save();
+                        $params = [
+                            'fhType' => 0,
+                            'fhWl' => '',
+                            'fhWlNo' => '',
+                            'staffId' => 0,
+                            'staffName' => '',
+                        ];
+                        //花店会增加路上库存
+                        OrderClass::orderSend($order, $params);
+                    }
                     break;
-
-                // 配送方取消订单
-                case IntraCityExpress::ORDER_STATUS_CANCELED_BY_DELIVERY:
-                    $eo->orderStatus = 3;
-                    $eo->status = 0;
-                    // 更新 xhOrder 表的订单状态与配送状态 -- 待配送|取消
-                    OrderClass::updateById($orderId, ['status' => 2, 'sendStatus' => 3]);
-                    $msg = '配送方取消配送,订单编号 ';
-                    break;
-
                 // 配送员接单
                 case IntraCityExpress::ORDER_STATUS_ACCEPTED:
-                    $eo->orderStatus = 4;
-                    // 更新 xhOrder 表的订单状态与配送状态 -- 配送中|已发货
-                    OrderClass::updateById($orderId, ['status' => 3, 'sendStatus' => 1]); //订单创建时已执行了,这儿重复更新
+                    if ($order->status == 3) {
+                        $eo->orderStatus = 4;//跑腿已接单
+                        $eo->save();
+                        $order->sendStatus = 1;//跑腿已接单
+                        $order->save();
+                    }
                     break;
-
                 // 配送员到店
                 case IntraCityExpress::ORDER_STATUS_ARRIVED:
-                    $eo->orderStatus = 5;
-                    // 更新 xhOrder 表的订单状态与配送状态 -- 配送中|已发货
-                    OrderClass::updateById($orderId, ['status' => 3, 'sendStatus' => 4]); //订单创建时已执行了,这儿重复更新
+                    if ($order->status == 3) {
+                        $eo->orderStatus = 5;//跑腿到店
+                        $eo->save();
+                        $order->sendStatus = 4;//跑腿到店
+                        $order->save();
+                    }
                     break;
-
                 // 配送中
                 case IntraCityExpress::ORDER_STATUS_DELIVERING:
-                    $eo->orderStatus = 6;
-                    OrderClass::updateById($orderId, ['sendStatus' => 5]);
+                    if ($order->status == 3) {
+                        $eo->orderStatus = 6;//跑腿配送中
+                        $eo->save();
+                        $order->sendStatus = 5;//跑腿配送中
+                        $order->save();
+                    }
+                    break;
+                // 配送完成
+                case IntraCityExpress::ORDER_STATUS_COMPLETED:
+                    if ($order->status == 3) {
+                        $eo->orderStatus = 8;//配送完成
+                        $eo->save();
+                        $order->sendStatus = 2;//已送达
+                        $order->save();
+                        $params = ['staffId' => 0, 'staffName' => ''];
+                        OrderClass::confirmReach($order, $params);
+                    }
+                    break;
+                // 商家取消订单
+                case IntraCityExpress::ORDER_STATUS_CANCELED_BY_MERCHANT:
+                    //取消已发货,回滚到待发货
+                    if ($order->status == 3) {
+                        $eo->orderStatus = 2;
+                        $eo->save();
+                        $order->sendStatus = 3;
+                        $order->save();
+                        $params = ['staffId' => 0, 'staffName' => ''];
+                        OrderClass::cancelOrderSend($order, $params);
+                    }
+                    $msg = '取消配送,订单编号 ';
+                    break;
+                // 配送方取消订单
+                case IntraCityExpress::ORDER_STATUS_CANCELED_BY_DELIVERY:
+                    //取消已发货,回滚到待发货
+                    if ($order->status == 3) {
+                        $eo->orderStatus = 3;
+                        $eo->status = 0;
+                        $eo->save();
+                        $order->sendStatus = 3;
+                        $order->save();
+                        $params = ['staffId' => 0, 'staffName' => ''];
+                        OrderClass::cancelOrderSend($order, $params);
+                    }
+                    $msg = '配送方取消配送,订单编号 ';
                     break;
-
                 // 配送员撤单
                 case IntraCityExpress::ORDER_STATUS_WITHDRAWN:
-                    $eo->orderStatus = 7;
-                    $eo->status = 0;
-                    // 更新 xhOrder 表的订单状态与配送状态 -- 待配送|未发货
-                    OrderClass::updateById($orderId, ['status' => 2, 'sendStatus' => 3]);
+                    //todo 配送员撤单,目前我们认为会重新派单,先不要有任何操作!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
                     $msg = '跑腿取消配送,订单编号 ';
                     break;
-
-                // 配送完成
-                case IntraCityExpress::ORDER_STATUS_COMPLETED:
-                    $eo->orderStatus = 8;
-                    // 更新 xhOrder 表的订单状态与配送状态 -- 已完成|已送达
-                    OrderClass::updateById($orderId, ['status' => 4, 'sendStatus' => 2]);
-                    break;
-
                 // 配送异常
                 case IntraCityExpress::ORDER_STATUS_EXCEPTION:
-                    $eo->orderStatus = 9;
-                    $eo->status = 0;
-                    noticeUtil::push('同城配送异常 --- store_order_id(orderId):' . $storeOrderId . ',wx_store_id:' . $wxStoreId);
-                    // 更新 xhOrder 表的订单状态与配送状态 -- 待配送|未发货
-                    OrderClass::updateById($orderId, ['status' => 2, 'sendStatus' => 3]);
+                    //取消已发货,回滚到待发货
+                    if ($order->status == 3) {
+                        $eo->orderStatus = 9;
+                        $eo->status = 0;
+                        $eo->save();
+                        $order->sendStatus = 3;
+                        $order->save();
+                        $params = ['staffId' => 0, 'staffName' => ''];
+                        OrderClass::cancelOrderSend($order, $params);
+                    }
                     $msg = '订单配送异常,订单编号 ';
                     break;
             }
-            $eo->save();
             // ====================== 事务提交
             $tx->commit();
             if (!empty($msg)) {

+ 2 - 1
app-ghs/controllers/OrderController.php

@@ -270,12 +270,13 @@ class OrderController extends BaseController
         ];
 
         if ($order->book == 1) {
-            util::fail('预订单不支持这个发货方式');
+            util::fail('预订单不能直接发货');
         }
 
         $connection = Yii::$app->db;
         $transaction = $connection->beginTransaction();
         try {
+            //花店会增加路上库存
             OrderClass::orderSend($order, $params);
             $transaction->commit();
             util::complete();

+ 86 - 65
app-hd/controllers/IntraCityController.php

@@ -650,103 +650,124 @@ class IntraCityController extends BaseController
                 Yii::error('订单不存在.store_order_id: ' . $storeOrderId . ',wx_store_id: ' . $wxStoreId);
                 return $this->asJson(['return_code' => 1, 'return_msg' => '系统错误']);
             }
-            // 从 $storeOrderId 提取 orderId
-            $arr = explode('_', $storeOrderId);
-            $orderId = intval($arr[0]);
-            if ($orderId == 0) {
-                Yii::error('订单号为0.  store_order_id: ' . $storeOrderId . ',wx_store_id: ' . $wxStoreId);
-                return $this->asJson(['return_code' => 1, 'return_msg' => '系统错误']);
+            $orderId = $eo->orderId ?? 0;
+            if (empty($orderId)) {
+                $errRemind = '订单号为空,store_order_id: ' . $storeOrderId . ',wx_store_id: ' . $wxStoreId;
+                Yii::error($errRemind, 'intracity');
+                noticeUtil::push($errRemind, '15280215347');
+                return $this->asJson(['return_code' => 1, 'return_msg' => '系统错误2']);
+            }
+            $order = OrderClass::getById($orderId, true, 'id,mainId,status,sendStatus');
+            if (empty($order)) {
+                $errRemind = '没有找到订单,store_order_id: ' . $storeOrderId . ',wx_store_id: ' . $wxStoreId;
+                Yii::error($errRemind, 'intracity');
+                noticeUtil::push($errRemind, '15280215347');
+                return $this->asJson(['return_code' => 1, 'return_msg' => '系统错误3']);
             }
+            $orderStatus = intval($callbackData['order_status']);
+
+            //同个配送单,同个状态的,5秒内不允许重复请求,重要勿删
+            $uniqueId = $storeOrderId . '_' . $orderStatus;
+            util::checkRepeatCommit($uniqueId, 5);
 
             $tx = Yii::$app->db->beginTransaction(); // ====================== 开启事务
             $msg = ''; // 发通知的内容(默认为空,根据情况生成。没有内容则不会发通知)
-            $orderStatus = intval($callbackData['order_status']);
             switch ($orderStatus) {
-                // 订单创建成功
+                // 订单创建成功,已叫跑腿,等跑腿接单
                 case IntraCityExpress::ORDER_STATUS_CREATED:
-                    $eo->orderStatus = 1;
-                    // 更新 xhOrder 表的订单状态与配送状态 -- 配送中|已发货
-                    OrderClass::updateById($orderId, ['status' => 3, 'sendStatus' => 0]);
-                    break;
-
-                // 商家取消订单
-                case IntraCityExpress::ORDER_STATUS_CANCELED_BY_MERCHANT:
-                    $eo->orderStatus = 2;
-                    // 更新 xhOrder 表的订单状态与配送状态 -- 待配送|取消
-                    OrderClass::updateById($orderId, ['status' => 2, 'sendStatus' => 3]);
-                    $msg = '取消配送,订单编号 ';
+                    if ($order->status == 2) {
+                        $eo->orderStatus = 1;
+                        $eo->save();
+                        $order->status = 3;
+                        $order->sendStatus = 0;
+                        $order->save();
+                    }
                     break;
-
-                // 配送方取消订单
-                case IntraCityExpress::ORDER_STATUS_CANCELED_BY_DELIVERY:
-                    $eo->orderStatus = 3;
-                    $eo->status = 0;
-                    // 更新 xhOrder 表的订单状态与配送状态 -- 待配送|取消
-                    OrderClass::updateById($orderId, ['status' => 2, 'sendStatus' => 3]);
-                    $msg = '配送方取消配送,订单编号 ';
-                    break;
-
                 // 配送员接单
                 case IntraCityExpress::ORDER_STATUS_ACCEPTED:
-                    $eo->orderStatus = 4;
-                    // 更新 xhOrder 表的订单状态与配送状态 -- 配送中|已发货
-                    OrderClass::updateById($orderId, ['status' => 3, 'sendStatus' => 1]); //订单创建时已执行了,这儿重复更新
+                    if ($order->status == 3) {
+                        $eo->orderStatus = 4;
+                        $eo->save();
+                        $order->sendStatus = 1;
+                        $order->save();
+                    }
                     break;
 
                 // 配送员到店
                 case IntraCityExpress::ORDER_STATUS_ARRIVED:
-                    $eo->orderStatus = 5;
-                    // 更新 xhOrder 表的订单状态与配送状态 -- 配送中|已发货
-                    OrderClass::updateById($orderId, ['status' => 3, 'sendStatus' => 4]); //订单创建时已执行了,这儿重复更新
+                    if ($order->status == 3) {
+                        $eo->orderStatus = 5;
+                        $eo->save();
+                        $order->sendStatus = 4;
+                        $order->save();
+                    }
                     break;
-
                 // 配送中
                 case IntraCityExpress::ORDER_STATUS_DELIVERING:
-                    $eo->orderStatus = 6;
-                    OrderClass::updateById($orderId, ['sendStatus' => 5]);
+                    if ($order->status == 3) {
+                        $eo->orderStatus = 6;
+                        $eo->save();
+                        $order->sendStatus = 5;
+                        $order->save();
+                    }
+                    break;
+                // 配送完成
+                case IntraCityExpress::ORDER_STATUS_COMPLETED:
+                    if ($order->status == 3) {
+                        $eo->orderStatus = 8;
+                        $eo->save();
+                        $order->status = 4;//配送完成
+                        $order->sendStatus = 2;//配送完成
+                        $order->save();
+                    }
+                    break;
+                // 商家取消订单
+                case IntraCityExpress::ORDER_STATUS_CANCELED_BY_MERCHANT:
+                    if ($order->status == 3) {
+                        $eo->orderStatus = 2;
+                        $eo->save();
+                        $order->status = 2;//取消配送
+                        $order->sendStatus = 3;//取消配送
+                        $order->save();
+                    }
+                    $msg = '取消配送,订单编号 ';
                     break;
-
                 // 配送员撤单
                 case IntraCityExpress::ORDER_STATUS_WITHDRAWN:
-                    $eo->orderStatus = 7;
-                    $eo->status = 0;
-                    // 更新 xhOrder 表的订单状态与配送状态 -- 待配送|未发货
-                    OrderClass::updateById($orderId, ['status' => 2, 'sendStatus' => 3]);
+                    //todo 配送员撤单,目前我们认为会重新派单,先不要有任何操作!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
                     $msg = '跑腿取消配送,订单编号 ';
                     break;
-
-                // 配送完成
-                case IntraCityExpress::ORDER_STATUS_COMPLETED:
-                    $eo->orderStatus = 8;
-                    // 更新 xhOrder 表的订单状态与配送状态 -- 已完成|已送达
-                    OrderClass::updateById($orderId, ['status' => 4, 'sendStatus' => 2]);
+                // 配送方取消订单
+                case IntraCityExpress::ORDER_STATUS_CANCELED_BY_DELIVERY:
+                    if ($order->status == 3) {
+                        $eo->orderStatus = 3;
+                        $eo->status = 0;
+                        $eo->save();
+                        $order->status = 2;//取消配送
+                        $order->sendStatus = 3;//取消配送
+                        $order->save();
+                    }
+                    $msg = '配送方取消配送,订单编号 ';
                     break;
-
                 // 配送异常
                 case IntraCityExpress::ORDER_STATUS_EXCEPTION:
-                    $eo->orderStatus = 9;
-                    $eo->status = 0;
-                    noticeUtil::push('同城配送异常 --- store_order_id(orderId):' . $storeOrderId . ',wx_store_id:' . $wxStoreId);
-                    // 更新 xhOrder 表的订单状态与配送状态 -- 待配送|未发货
-                    OrderClass::updateById($orderId, ['status' => 2, 'sendStatus' => 3]);
+                    if ($order->status == 3) {
+                        $eo->orderStatus = 9;
+                        $eo->status = 0;
+                        $eo->save();
+                        $order->status = 2;//取消配送
+                        $order->sendStatus = 3;//取消配送
+                        $order->save();
+                    }
                     $msg = '订单配送异常,订单编号 ';
                     break;
             }
-
-            if ($msg != '') { // $msg 不为空,则发通知
+            if (empty($msg)) { // $msg 不为空,则发通知
                 $order = OrderClass::getById($orderId, true, 'id, shopId, customName, sendNum');
                 $shop = ShopClass::getById($order->shopId, true, 'id, ptStyle, mainId');
                 $result = $msg . $order->sendNum;
                 WxMessageClass::expressErrorInform($shop, $order->customName, $orderId, $result);
             }
-            $re = $eo->save();
-            if (!$re) {
-                noticeUtil::push('同城配送回调更新订单状态失败. store_order_id:' . $storeOrderId . ',wx_store_id:' . $wxStoreId . ',status:' . $eo->status);
-                Yii::error('更新订单状态失败. store_order_id:' . $storeOrderId . ',wx_store_id:' . $wxStoreId . ',status:' . $eo->status);
-                $tx->rollBack();  // ====================== 事务回滚
-                return $this->asJson(['return_code' => 1, 'return_msg' => '系统错误']);
-            }
-
             $tx->commit();  // ====================== 事务提交
             return $this->asJson(['return_code' => 0, 'return_msg' => 'OK']); // 成功状态的返回数据
         } catch (\Exception $e) {

+ 15 - 2
biz-ghs/order/classes/OrderClass.php

@@ -477,18 +477,31 @@ class OrderClass extends BaseClass
         PurchaseClass::orderFh($cgInfo, $params, $allowRepeat, true);
     }
 
+    //取消发货 ssh 20250917
+    public static function cancelOrderSend($order, $params)
+    {
+        $order->status = 2;
+        $order->save();
+        $cgId = $order->purchaseId ?? 0;
+        $cgInfo = PurchaseClass::getById($cgId, true);
+        if (empty($cgInfo)) {
+            util::fail('没有找到采购信息');
+        }
+        PurchaseClass::cancelFh($cgInfo, $params);
+    }
+
     //订单发货子方法 ssh 20231119
     public static function orderFh($order, $params, $allowRepeat = false)
     {
         if ($order->status == 3) {
-            if ($allowRepeat == false) {
+            if (!$allowRepeat) {
                 util::fail('订单已发货');
             } else {
                 return true;
             }
         }
         $fhType = $params['fhType'] ?? 0;
-        if (is_numeric($fhType) == false) {
+        if (!is_numeric($fhType)) {
             util::fail('请选择发货类型');
         }
         if ($fhType == 1) {

+ 40 - 0
biz-hd/purchase/classes/PurchaseClass.php

@@ -98,6 +98,46 @@ class PurchaseClass extends BaseClass
         return $respond;
     }
 
+    public static function cancelFh($cg, $params)
+    {
+        $cg->status = 2;
+        $cg->save();
+        $orderSn = $cg->orderSn ?? '';
+        $itemList = PurchaseItemClass::getAllByCondition(['orderSn' => $orderSn], null, '*', null, true);
+        if (!empty($itemList)) {
+            $sjId = $cg->sjId ?? 0;
+            $shopId = $cg->shopId ?? 0;
+            $mainId = $cg->mainId ?? 0;
+            $ghsName = $cg->ghsName ?? '';
+            foreach ($itemList as $key => $val) {
+                $productId = $val->productId ?? 0;
+                $itemId = $val->itemId ?? 0;
+                $num = $val->xhNum ?? 0;
+                $product = ProductClass::getLockById($productId);
+                if (empty($product)) {
+                    util::fail('没有找到花材呢');
+                }
+                //减少路上库存
+                $onRecord = [];
+                $onRecord['sjId'] = $sjId;
+                $onRecord['shopId'] = $shopId;
+                $onRecord['mainId'] = $mainId;
+                $onRecord['orderSn'] = $orderSn;
+                $onRecord['productId'] = $productId;
+                $onRecord['itemId'] = $itemId;
+                $onRecord['relateName'] = $ghsName;
+                $onRecord['itemNum'] = $num;
+                $oldOnStock = $product->onStock ?? 0;
+                $onRecord['oldStock'] = $oldOnStock;
+                $newOnStock = bcsub($oldOnStock, $num);
+                $onRecord['newStock'] = $newOnStock;
+                $onRecord['ptStyle'] = 1;
+                OnStockRecordClass::addPurchaseOrderRecord($onRecord);
+                ProductClass::decreaseOnStockByItemNum($productId, $num);
+            }
+        }
+    }
+
     //订单发货子方法 ssh 20231119
     public static function orderFh($cg, $params, $allowRepeat = false, $notice = false)
     {