Ver Fonte

1.解决获取各平台报价bug 2.补预约上门时间与备注

shizhongqi há 9 meses atrás
pai
commit
ace3f521ca

+ 6 - 5
app-ghs/controllers/DeliveryController.php

@@ -261,19 +261,21 @@ class DeliveryController extends BaseController
     {
         $post = Yii::$app->request->post();
         $orderTime = $post['pickupTime'];
+        $remark = $post['remark'];
 
         $adminId = $this->adminId;
         util::checkRepeatCommit($adminId, 4);
 
         $orderId = intval($post['orderId']);
         $order = OrderClass::getById($orderId);
+        $order['remark'] = $remark; // 把备注信息写入
         $shop = ShopClass::getById($this->shopId);
 
         $ds = new DispatchService($this->mainId);
-        $platforms = $ds->getAllPlatformPrice($order, $shop, $orderTime);
+        $platformQuotes = $ds->getAllPlatformPrice($order, $shop, $orderTime);
 
         $deliveryList = [];
-        foreach ($platforms['quotes'] as $item) {
+        foreach ($platformQuotes['quotes'] as $item) {
             switch ($item['platform']) {
                 case 'shunfeng':
                     $deliveryList[] = [
@@ -331,7 +333,6 @@ class DeliveryController extends BaseController
                     }
                     break;
                 case 'huolala':
-                    $deliveryList = [];
                     foreach($item['price_info_list'] as $arr) {
                         $priceInfo = $arr['calculate_price_info'];
                         $vehicleType = $arr['vehicle_type'];
@@ -378,9 +379,9 @@ class DeliveryController extends BaseController
 
         $params['mainId'] = $this->mainId;
         $params['ip'] = Yii::$app->request->userIP;
-        $params['remark'] = $post['remark'];
+        $params['remark'] = $post['reark'];
         $params['total_price_fen'] = $post['price'];
-        $params['order_time'] = $pickupTime['value'];
+        $params['pickupTime'] = $pickupTime['value'];
         $shopId = $this->shopId;
 
         $ghsOrder = OrderClass::getById($orderId, true);

+ 1 - 2
common/components/delivery/helpers/HttpClient.php

@@ -228,8 +228,7 @@ class HttpClient
                 $platformName = $platformNames[$index] ?? "platform_{$index}";
                 $status = $response->getStatusCode();
                 $respBody = (string) $response->getBody();
-
-                Yii::info("[HttpClient:Concurrent] {$platformName} completed with status {$status}");
+                //Yii::info("[HttpClient:Concurrent] {$platformName} completed with status {$status}");
 
                 $json = json_decode($respBody, true);
                 $results['success'][$platformName] = $json ?: ['code' => $status, 'body' => $respBody];

+ 25 - 24
common/components/delivery/services/DispatchService.php

@@ -234,7 +234,7 @@ class DispatchService
         // 构建所有车型数据
         $vehicleTypeList = [];
         foreach ($vehicleList as $vehicle) {
-            if(!in_array($vehicle['vehicle_name'], ['跑腿', '小面', '微面']) && !$this->adapters['huolala']->getIsSandbox()){
+            if(!in_array($vehicle['vehicle_name'], ['跑腿', '小面', '微面'])){ // && !$this->adapters['huolala']->getIsSandbox()
                 continue;
             }
 
@@ -335,35 +335,35 @@ class DispatchService
     {
         return [
             'platform' => 'shansong',
-            'city_name' => $shop['city'],
+            'cityName' => $shop['city'],
             'sender' => [
-                'from_address' => $shop['address'],
-                'from_address_detail' => $shop['floor'],
-                'from_sender_name' => $shop['shopName'],
-                'from_mobile' => $shop['mobile'],
-                'from_latitude' => (float)$shop['lat'],
-                'from_longitude' => (float)$shop['long'],
+                'fromAddress' => $shop['address'],
+                'fromAddressDetail' => $shop['floor'],
+                'fromSenderName' => $shop['shopName'],
+                'fromMobile' => $shop['mobile'],
+                'fromLatitude' => (float)$shop['lat'],
+                'fromLongitude' => (float)$shop['long'],
             ],
-            'receiver_list' => [
+            'receiverList' => [
                 [
-                    'order_no' => $order['orderSn'],
-                    'to_address' => $order['address'],
-                    'to_address_detail' => $order['floor'],
-                    'to_receiver_name' => $order['customName'],
-                    'to_mobile' => $order['customMobile'],
-                    'to_latitude' => (float)$order['lat'],
-                    'to_longitude' => (float)$order['long'],
-                    'good_type' => 7,
+                    'orderNo' => $order['orderSn'],
+                    'toAddress' => $order['address'],
+                    'toAddressDetail' => $order['floor'],
+                    'toReceiverName' => $order['customName'],
+                    'toMobile' => $order['customMobile'],
+                    'toLatitude' => (float)$order['lat'],
+                    'toLongitude' => (float)$order['long'],
+                    'goodType' => 7,
                     'weight' => (int)$order['weight'],
                     'remarks' => $order['remark'] ?? '',
                 ]
             ],
-            'appoint_type' => 0,
-            'appointment_date' => '',
-            'travel_way' => 0,
-            'delivery_type' => 1,
-            'expect_start_time' => null,
-            'expect_end_time' => null,
+            'appointType' => 0,
+            'appointmentDate' => '',
+            'travelWay' => 0,
+            'deliveryType' => 1,
+            'expectStartTime' => null,
+            'expectEndTime' => null,
         ];
     }
 
@@ -524,6 +524,7 @@ class DispatchService
                             'calculate_price_info' => isset($quote['calculate_price_info_list']) ? $quote['calculate_price_info_list'][0] : [],
                             'vehicle_type' => $data['vehicle_type_list'][$vehicle_type_list_key]
                         ];
+                        Yii::info("[DispatchService] {$platform} 报价成功: " . json_encode($quote));
                     }
                 } else {
                     // 蜂鸟和闪送的响应处理
@@ -531,7 +532,7 @@ class DispatchService
                     if ($quote && !isset($quote['error'])) {
                         $quote['_duration'] = $totalDuration;
                         $results['success'][$platform] = $quote;
-                        Yii::info("[DispatchService] {$platform} 报价成功 (" . round($totalDuration * 1000) . "ms)");
+                        Yii::info("[DispatchService] {$platform} 报价成功: " . json_encode($quote));
                     } else {
                         $errorMsg = $quote['error'] ?? '报价返回数据为空';
                         $results['failed'][$platform] = $errorMsg;

+ 1 - 1
common/components/delivery/services/adapter/FengniaoAdapter.php

@@ -56,7 +56,7 @@ class FengniaoAdapter extends Fengniao implements Adapter
     public function formatOrderData($order, $shop, $params)
     {
         // 订单类型为预约单时必传,如需要送达时间 – 推单时间 < 60min,则蜂鸟配送开放平台自动将订单类型置为即时单
-        $timeDiff = strtotime($params['order_time']) - time();
+        $timeDiff = strtotime($params['pickupTime']) - time();
         $orderType = 1;
         if ($timeDiff > 3600) {
             $orderType = 3;

+ 4 - 3
common/components/delivery/services/adapter/HuolalaAdapter.php

@@ -14,7 +14,7 @@ use common\components\delivery\platform\huolala\Huolala;
 class HuolalaAdapter extends Huolala implements Adapter
 {
     private const CITY_VEHICLE_CACHE_TTL = 259200; // 3 days
-    private const CITY_VEHICLE_CACHE_KEY_PATTERN = 'huolala-city-vehicle:%d';
+    private const CITY_VEHICLE_CACHE_KEY_PATTERN = 'huolala-city-vehicle:%d_%s';
     /**
      * 获取已开通城市列表
      * 
@@ -47,8 +47,9 @@ class HuolalaAdapter extends Huolala implements Adapter
             return null;
         }
         $cityId = (int)$cityId;
+        $env = $this->isSandbox ? 'dev' : 'production'; // 避免切环境后,使用了不同环境的缓存数据
 
-        $cacheKey = sprintf(self::CITY_VEHICLE_CACHE_KEY_PATTERN, $cityId);
+        $cacheKey = sprintf(self::CITY_VEHICLE_CACHE_KEY_PATTERN, $cityId, $env);
         $redis = Yii::$app->has('redis') ? Yii::$app->redis : null;
 
         if ($redis !== null) {
@@ -169,7 +170,7 @@ class HuolalaAdapter extends Huolala implements Adapter
     public function formatOrderData($order, $shop, $params)
     {
         //用车时间 -- 用车时间(unix时间戳:秒)。 取值范围:(当前时间+10分钟)<=用车时间<=(当前时间+5天)
-        $orderTime = strtotime($params['order_time']);
+        $orderTime = strtotime($params['pickupTime']);
         if($orderTime < (time()+600)) {
             $orderTime = time() + 600;
         }

+ 23 - 23
common/components/delivery/services/adapter/ShansongAdapter.php

@@ -88,30 +88,30 @@ class ShansongAdapter extends Shansong implements Adapter
         // 构建发件人信息
         $sd = $data['sender'];// $senderData
         $sender = [
-            'fromAddress' => $sd['from_address'] ?? '',
-            'fromAddressDetail' => $sd['from_address_detail'] ?? '',
-            'fromSenderName' => $sd['from_sender_name'] ?? '',
-            'fromMobile' => $sd['from_mobile'] ?? '',
-            'fromLatitude' => $sd['from_latitude'] ?? '',
-            'fromLongitude' => $sd['from_longitude'] ?? '',
+            'fromAddress' => $sd['fromAddress'],
+            'fromAddressDetail' => $sd['fromAddressDetail'],
+            'fromSenderName' => $sd['fromSenderName'],
+            'fromMobile' => $sd['fromMobile'],
+            'fromLatitude' => $sd['fromLatitude'],
+            'fromLongitude' => $sd['fromLongitude'],
         ];
 
         // 构建收件人信息列表
         $receiverList = [];
-        foreach ($data['receiver_list'] as $receiver) {
+        foreach ($data['receiverList'] as $receiver) {
             $receiverList[] = [
-                'orderNo' => $receiver['order_no'] ?? '',
-                'toAddress' => $receiver['to_address'] ?? '',
-                'toAddressDetail' => $receiver['to_address_detail'] ?? '',
-                'toReceiverName' => $receiver['to_receiver_name'] ?? '',
-                'toMobile' => $receiver['to_mobile'] ?? '',
-                'toLatitude' => $receiver['to_latitude'] ?? '',
-                'toLongitude' => $receiver['to_longitude'] ?? '',
-                'goodType' => (int) ($receiver['good_type'] ?? 10),  // 物品类型,默认10-其他
+                'orderNo' => $receiver['orderNo'],
+                'toAddress' => $receiver['toAddress'] ?? '',
+                'toAddressDetail' => $receiver['toAddressDetail'] ?? '',
+                'toReceiverName' => $receiver['toReceiverName'] ?? '',
+                'toMobile' => $receiver['toMobile'] ?? '',
+                'toLatitude' => $receiver['toLatitude'] ?? '',
+                'toLongitude' => $receiver['toLongitude'] ?? '',
+                'goodType' => $receiver['goodType'],  // 物品类型,默认10-其他
                 'weight' => (int) ($receiver['weight'] ?? 1),         // 物品重量(必须是整数kg)
-                //'remarks' => $receiver['remarks'] ?? '',
-                'expectStartTime' => isset($receiver['expect_start_time']) ? (int) $receiver['expect_start_time'] : null,
-                'expectEndTime' => isset($receiver['expect_end_time']) ? (int) $receiver['expect_end_time'] : null,
+                //'remarks' => $receiver['remarks'] ?? '', // TODO: 需要添加备注
+                'expectStartTime' => isset($receiver['expectStartTime']) ? (int) $receiver['expectStartTime'] : null,
+                'expectEndTime' => isset($receiver['expectEndTime']) ? (int) $receiver['expectEndTime'] : null,
             ];
 
             // 移除null值的期望时间字段
@@ -125,13 +125,13 @@ class ShansongAdapter extends Shansong implements Adapter
 
         // 构建请求体
         $requestData = [
-            'cityName' => $data['city_name'] ?? '',
+            'cityName' => $data['cityName'],
             'appointType' => $appointType,
             'sender' => $sender,
             'receiverList' => $receiverList,
-            'storeId' => isset($data['store_id']) ? (int) $data['store_id'] : null,
-            'travelWay' => (int) ($data['travel_way'] ?? 0),
-            'deliveryType' => (int) ($data['delivery_type'] ?? 1),
+            'storeId' => isset($data['storeId']) ? (int) $data['storeId'] : null,
+            'travelWay' => (int) ($data['travelWay'] ?? 0),
+            'deliveryType' => (int) ($data['deliveryType'] ?? 1),
         ];
 
         // 如果有预约日期,添加到请求体
@@ -158,7 +158,7 @@ class ShansongAdapter extends Shansong implements Adapter
             'url' => "{$this->baseUrl}/openapi/developer/v5/orderCalculate",
             'data' => $payload,
             'headers' => [],
-            'timeout' => 5.0,
+            'timeout' => 10.0,
         ];
     }
 

+ 11 - 7
common/components/delivery/services/adapter/ShunfengAdapter.php

@@ -73,16 +73,13 @@ class ShunfengAdapter extends Shunfeng implements Adapter
             $productTypeNum = 1;
         }
 
-        // 获取订单时间
-        $orderTime = isset($order['addTime']) ? strtotime($order['addTime']) : time();
-
         // 构建必填参数
         $data = [
             // ==================== 必填字段 ====================
             'shop_order_id' => $order['orderSn'],
             'order_ver' => time(), // 订单版本号	使用相同的商家订单号,同城侧会幂等返回,可以使用此参数+1控制生成新的同城订单
             'order_source' => $params['order_source'] ?? '花店系统', // 订单接入来源
-            'order_time' => $orderTime, // 用户下单时间(秒级时间戳)
+            'order_time' => isset($order['addTime']) ? strtotime($order['addTime']) : time(), // 用户下单时间(秒级时间戳)
             'push_time' => time(), // 推单时间(秒级时间戳)
             'version' => $this->apiVersion, // API版本号
 
@@ -116,8 +113,7 @@ class ShunfengAdapter extends Shunfeng implements Adapter
             ],
 
             // ==================== 可选字段 ====================
-            'lbs_type' => 2, // 坐标类型(2:高德坐标)
-            // 'is_appoint' => 0, // 是否预约单(0:非预约单)  // TODO
+            'lbs_type' => 2, // 坐标类型(1:百度坐标,2:高德坐标(国测坐标),默认为高德坐标系)
             'is_insured' => 0, // 是否保价(0:非保价)
             'is_person_direct' => 0, // 是否专人直送(0:否)
             'vehicle' => 0, // 配送交通工具(0:否,1:电动车,2:小轿车)
@@ -128,6 +124,14 @@ class ShunfengAdapter extends Shunfeng implements Adapter
             'payment_method' => 1, // 支付方式(1:立即支付,2:到付)
         ];
 
+        // 用户期望上门时间 --  expect_pickup_time
+        $expectPickupTime = isset($params['pickupTime']) ? strtotime($params['pickupTime']) : time();
+        if($expectPickupTime > time() + 3600){ // 用户期望上门时间大于当前时间+1小时,则认为是预约单
+            $data['appoint_type'] = 2;
+            $data['expect_pickup_time'] = $expectPickupTime;
+            $data['is_appoint'] = 1; // 是否预约单(0:非预约单)-- 修改为预约单
+        }
+
         return $data;
     }
 
@@ -388,7 +392,7 @@ class ShunfengAdapter extends Shunfeng implements Adapter
             'url' => $this->baseUrl . 'precreateorder?sign=' .  $sign,
             'data' => $payload,
             'headers' => ["Content-Type" => "application/json"],
-            'timeout' => 5.0,
+            'timeout' => 10.0,
         ];
     }
 }