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

1. 如果【配送单】变成:商家取消订单、配送员撤单、配送异常,则【订单】变成待发货状态。且要能重新呼叫跑腿
2. 已经请求呼叫跑腿,创建配送单做判断,避免重复创建配送单
3. 商家取消订单、配送员撤单、配送异常这三个情况要发微信通知

shizhongqi 11 месяцев назад
Родитель
Сommit
9dee7d6ad9

+ 0 - 137
app-ghs/controllers/IntraCityController.php

@@ -589,141 +589,4 @@ class IntraCityController extends BaseController
         }
     }
 
-    /**
-     * 微信回调接口
-     * POST /intra-city/callback
-     */
-    public function actionCallback()
-    {
-        try {
-            $callbackData = Yii::$app->request->post();
-            if (empty($callbackData)) {
-                $postStr = file_get_contents('php://input');
-                // 处理转义字符,将JSON字符串正确解析为数组
-                $postStr = stripslashes($postStr);
-                $callbackData = json_decode($postStr, true);
-
-                if (empty($callbackData)) {
-                    util::fail('回调请求的数据为空');
-                }
-            }
-
-            // 从配置中获取安全token
-            // $token = Yii::$app->params['wx_intracity_token'] ?? 'your_token_here';
-            // $result = IntraCityExpress::handleOrderCallback($callbackData, $token);
-
-            // 记录回调日志
-            Yii::info('同城配送回调:' . json_encode($callbackData, JSON_UNESCAPED_UNICODE));
-
-            $storeOrderId = isset($callbackData['store_order_id']) ? $callbackData['store_order_id'] : 0;
-            $wxStoreId = $callbackData['wx_store_id'];
-
-            // 使用 storeOrderId 与 wxStoreId 去查询 xhExpressOrder 表
-            $eo = ExpressOrderClass::getByCondition(['storeOrderId' => $storeOrderId, 'wxStoreId' => $wxStoreId], true, false);
-            if (empty($eo)) {
-                Yii::error('订单不存在.store_order_id: ' . $storeOrderId . ',wx_store_id: ' . $wxStoreId);
-                echo Json::encode([
-                    'return_code' => 1,
-                    'return_msg' => '系统错误'
-                ]);
-                exit();
-            }
-            // 从 $storeOrderId 提取 orderId
-            $arr = explode('_', $storeOrderId);
-            $orderId = intval($arr[0]);
-
-            $orderStatus = intval($callbackData['order_status']);
-            switch ($orderStatus) {
-                // 订单创建成功
-                case IntraCityExpress::ORDER_STATUS_CREATED:
-                    $eo->orderStatus = ExpressOrder::ORDER_STATUS_CREATED;
-                    $eo->status = ExpressOrder::STATUS_CREATED;
-                    // 更新 xhOrder 表的订单状态与配送状态 -- 配送中|已发货
-                    OrderClass::updateById($orderId, ['status' => OrderClass::ORDER_STATUS_SENDING, 'sendStatus' => OrderClass::SEND_STATUS_SENDING]);
-                    break;
-
-                // 商家取消订单
-                case IntraCityExpress::ORDER_STATUS_CANCELED_BY_MERCHANT:
-                    $eo->orderStatus = ExpressOrder::ORDER_STATUS_CANCELED_BY_MERCHANT;
-                    // 更新 xhOrder 表的订单状态与配送状态 -- 待配送|取消
-                    OrderClass::updateById($orderId, ['status' => OrderClass::ORDER_STATUS_UN_SEND, 'sendStatus' => OrderClass::SEND_STATUS_CANCEL]);
-                    break;
-
-                // 配送方取消订单
-                case IntraCityExpress::ORDER_STATUS_CANCELED_BY_DELIVERY:
-                    $eo->orderStatus = ExpressOrder::ORDER_STATUS_CANCELED_BY_DELIVERY;
-                    $eo->status = ExpressOrder::STATUS_CANCELED;
-                    // 更新 xhOrder 表的订单状态与配送状态 -- 待配送|取消
-                    OrderClass::updateById($orderId, ['status' => OrderClass::ORDER_STATUS_UN_SEND, 'sendStatus' => OrderClass::SEND_STATUS_CANCEL]);
-                    break;
-
-                // 配送员接单
-                case IntraCityExpress::ORDER_STATUS_ACCEPTED:
-                    $eo->orderStatus = ExpressOrder::ORDER_STATUS_ACCEPTED;
-                    // 更新 xhOrder 表的订单状态与配送状态 -- 配送中|已发货
-                    OrderClass::updateById($orderId, ['status' => OrderClass::ORDER_STATUS_SENDING, 'sendStatus' => OrderClass::SEND_STATUS_SENDING]); //订单创建时已执行了,这儿重复更新
-                    break;
-
-                // 配送员到店
-                case IntraCityExpress::ORDER_STATUS_ARRIVED:
-                    $eo->orderStatus = ExpressOrder::ORDER_STATUS_ARRIVED;
-                    // 更新 xhOrder 表的订单状态与配送状态 -- 配送中|已发货
-                    OrderClass::updateById($orderId, ['status' => OrderClass::ORDER_STATUS_SENDING, 'sendStatus' => OrderClass::SEND_STATUS_SENDING]); //订单创建时已执行了,这儿重复更新
-                    break;
-
-                // 配送中
-                case IntraCityExpress::ORDER_STATUS_DELIVERING:
-                    $eo->orderStatus = ExpressOrder::ORDER_STATUS_DELIVERING;
-                    break;
-
-                // 配送员撤单
-                case IntraCityExpress::ORDER_STATUS_WITHDRAWN:
-                    $eo->orderStatus = ExpressOrder::ORDER_STATUS_WITHDRAWN;
-                    // 更新 xhOrder 表的订单状态与配送状态 -- 待配送|未发货
-                    OrderClass::updateById($orderId, ['status' => OrderClass::ORDER_STATUS_UN_SEND, 'sendStatus' => OrderClass::SEND_STATUS_UNSEND]);
-                    break;
-
-                // 配送完成
-                case IntraCityExpress::ORDER_STATUS_COMPLETED:
-                    $eo->orderStatus = ExpressOrder::ORDER_STATUS_COMPLETED;
-                    $eo->status = ExpressOrder::STATUS_COMPLETED;
-                    // 更新 xhOrder 表的订单状态与配送状态 -- 已完成|已送达
-                    OrderClass::updateById($orderId, ['status' => OrderClass::ORDER_STATUS_COMPLETE, 'sendStatus' => OrderClass::SEND_STATUS_COMPLETED]);
-                    break;
-
-                // 配送异常
-                case IntraCityExpress::ORDER_STATUS_EXCEPTION:
-                    $eo->orderStatus = ExpressOrder::ORDER_STATUS_EXCEPTION;
-                    noticeUtil::push('同城配送异常 --- store_order_id(orderId):' . $storeOrderId . ',wx_store_id:' . $wxStoreId);
-                    break;
-            }
-            $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);
-                $re = [
-                    'return_code' => 0,
-                    'return_msg' => 'OK'
-                ];
-                echo Json::encode($re);
-                exit();
-            }
-
-            $result = [
-                'return_code' => 0,
-                'return_msg' => 'OK'
-            ];
-            echo Json::encode($result);
-            exit();
-        } catch (\Exception $e) {
-            Yii::error('同城配送回调处理异常:' . $e->getMessage());
-
-            echo Json::encode([
-                'return_code' => 1,
-                'return_msg' => '系统错误'
-            ]);
-            exit();
-        }
-    }
-
 }

+ 29 - 1
app-hd/controllers/IntraCityController.php

@@ -17,6 +17,7 @@ use biz\shop\classes\ShopClass;
 use yii\helpers\Json;
 use common\components\IntraCityExpress;
 use yii\db\Query;
+use biz\wx\classes\WxMessageClass;
 
 /**
  * 同城配送控制器
@@ -321,13 +322,26 @@ class IntraCityController extends BaseController
         try {
             $post = Yii::$app->request->post();
             $orderId = $post['orderId'];
-            $order = OrderClass::getById($orderId);
+            $field = 'mainId, status, sendStatus, repeat, forward, orderSn, userId, actPrice, sendNum';
+            $order = OrderClass::getById($orderId, false, $field);
             if (empty($order)) {
                 util::fail('订单出错');
             }
             if ($order['mainId'] != $this->mainId) {
                 util::fail('订单出错');
             }
+            // 不能创建配送的几种订单状态
+            $notCanCreateStatus = [OrderClass::ORDER_STATUS_UN_PAY, OrderClass::ORDER_STATUS_SENDING, OrderClass::ORDER_STATUS_COMPLETE, OrderClass::ORDER_HAD_REFUND];
+            if (in_array($order['status'], $notCanCreateStatus)) {
+                Yii::error('订单号:' . $orderId . ' 的状态是 ' . $order['status'] . ',不允许创建配送');
+                util::fail('当前订单状态无法创建配送');
+            }
+            // 不能创建配送的几种配送状态
+            $notCanCreateSendStatus = [OrderClass::SEND_STATUS_SENDING, OrderClass::SEND_STATUS_COMPLETED];
+            if (in_array($order['sendStatus'], $notCanCreateSendStatus)) {
+                Yii::error('订单号:' . $orderId . ' 的配送状态是 ' . $order['sendStatus'] . ',不允许重复创建配送');
+                util::fail('当前订单配送状态无法创建配送');
+            }
             if ($order['repeat'] == 1) {
                 util::fail('收款码订单不支持跑腿');
             }
@@ -659,6 +673,7 @@ class IntraCityController extends BaseController
             $arr = explode('_', $storeOrderId);
             $orderId = intval($arr[0]);
 
+            $msg = ''; // 发通知的内容(默认为空,根据情况生成。没有内容则不会发通知)
             $orderStatus = intval($callbackData['order_status']);
             switch ($orderStatus) {
                 // 订单创建成功
@@ -674,6 +689,7 @@ class IntraCityController extends BaseController
                     $eo->orderStatus = ExpressOrder::ORDER_STATUS_CANCELED_BY_MERCHANT;
                     // 更新 xhOrder 表的订单状态与配送状态 -- 待配送|取消
                     OrderClass::updateById($orderId, ['status' => OrderClass::ORDER_STATUS_UN_SEND, 'sendStatus' => OrderClass::SEND_STATUS_CANCEL]);
+                    $msg = '您有订单已取消配送(订单编号:';
                     break;
 
                 // 配送方取消订单
@@ -682,6 +698,7 @@ class IntraCityController extends BaseController
                     $eo->status = ExpressOrder::STATUS_CANCELED;
                     // 更新 xhOrder 表的订单状态与配送状态 -- 待配送|取消
                     OrderClass::updateById($orderId, ['status' => OrderClass::ORDER_STATUS_UN_SEND, 'sendStatus' => OrderClass::SEND_STATUS_CANCEL]);
+                    $msg = '您有订单被配送方取消(订单编号:';
                     break;
 
                 // 配送员接单
@@ -708,6 +725,7 @@ class IntraCityController extends BaseController
                     $eo->orderStatus = ExpressOrder::ORDER_STATUS_WITHDRAWN;
                     // 更新 xhOrder 表的订单状态与配送状态 -- 待配送|未发货
                     OrderClass::updateById($orderId, ['status' => OrderClass::ORDER_STATUS_UN_SEND, 'sendStatus' => OrderClass::SEND_STATUS_UNSEND]);
+                    $msg = '您有订单被配送员取消(订单编号:';
                     break;
 
                 // 配送完成
@@ -722,8 +740,18 @@ class IntraCityController extends BaseController
                 case IntraCityExpress::ORDER_STATUS_EXCEPTION:
                     $eo->orderStatus = ExpressOrder::ORDER_STATUS_EXCEPTION;
                     noticeUtil::push('同城配送异常 --- store_order_id(orderId):' . $storeOrderId . ',wx_store_id:' . $wxStoreId);
+                    // 更新 xhOrder 表的订单状态与配送状态 -- 待配送|未发货
+                    OrderClass::updateById($orderId, ['status' => OrderClass::ORDER_STATUS_UN_SEND, 'sendStatus' => OrderClass::SEND_STATUS_UNSEND]);
+                    $msg = '您有订单配送出现异常(订单编号:';
                     break;
             }
+
+            if ($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);

+ 1 - 1
app-mall/controllers/CategoryController.php

@@ -65,7 +65,7 @@ class CategoryController extends BaseController
         $stockModel = $shop->stockModel ?? 0;
         if ($stockModel == 1) {
             //管到支的,查看所有上架并且花材数量设置好的商品
-            $where['setItemNum'] = 1;
+            //$where['setItemNum'] = 1;
         }
 
         $data = GoodsCategoryService::getGoodsList($where);

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

@@ -44,6 +44,8 @@ class OrderClass extends BaseClass
 
     public static $baseFile = '\bizHd\order\models\Order';
 
+    //已退款
+    const ORDER_HAD_REFUND = 6;
     //已取消
     const ORDER_STATUS_CANCEL = 5;
     //完成

+ 4 - 4
biz/wx/classes/WxMessageClass.php

@@ -84,10 +84,10 @@ class WxMessageClass extends BaseClass
 
     /**
      * 跑腿配送异常通知 ssh 20250825
-     * @param $shop 对象
-     * @param $customName 客户名称
-     * @param $orderId 订单id
-     * @param $result 异常状态说明内容:配送异常、配送员撤单、配送方取消订单、商家取消订单,这四种情况,其它不是异常的不需要通知
+     * @param \yii\db\ActiveRecord $shop 对象
+     * @param string $customName 客户名称
+     * @param int $orderId 订单id
+     * @param string $result 异常状态说明内容:配送异常、配送员撤单、配送方取消订单、商家取消订单,这四种情况,其它不是异常的不需要通知
      * @return false|void
      */
     public static function expressErrorInform($shop, $customName, $orderId, $result)