Browse Source

检查跑腿平台根据取件时间设置相关配送参数是否正确:1.把 $orderTime 统一修改为$pickupTime 2.代码注释补全与修改

shizhongqi 7 months ago
parent
commit
8137d20c7f

+ 3 - 2
app-ghs/controllers/DeliveryController.php

@@ -219,7 +219,7 @@ class DeliveryController extends BaseController
             util::fail('客户地址信息缺失');
         }
 
-        $orderTime = $post['pickupTime'];
+        $pickupTime = $post['pickupTime'];
         $weight = $post['weight'];
         $remark = $post['remark'] ?? '';
         $order['weight'] = $weight;
@@ -227,7 +227,8 @@ class DeliveryController extends BaseController
         $shop = ShopClass::getById($this->shopId);
 
         $ds = new DispatchService($this->mainId);
-        $platformQuotes = $ds->getAllPlatformPrice($order, $shop, $orderTime);
+        $ds->validateOrder($order); //对 $order 进行验证
+        $platformQuotes = $ds->getAllPlatformPrice($order, $shop, $pickupTime);
         if (isset($platformQuotes['error'])) {
             util::fail($platformQuotes['error']);
         }

+ 1 - 0
app-hd/controllers/DeliveryController.php

@@ -140,6 +140,7 @@ class DeliveryController extends BaseController
         ];
         $ghsShop = ShopClass::getById($ghsShopId);
         $ds = new DispatchService($ghs->mainId);
+        $ds->validateOrder($order); //对 $order 进行验证
         $platformQuotes = $ds->getAllPlatformPrice($order, $ghsShop, $orderTime);
         if (isset($platformQuotes['error'])) {
             util::fail($platformQuotes['error']);

+ 2 - 1
common/components/delivery/platform/dada/Dada.php

@@ -33,7 +33,8 @@ class Dada
             $this->appSecret = '828a03677a1c00a3a5b3c59209c4433d';
         } else {
             // 测试环境配置
-            $this->baseUrl = self::TEST_BASE_URL;
+            $this->baseUrl = self::PROD_BASE_URL; // TODO
+            //$this->baseUrl = self::TEST_BASE_URL;
             $this->appKey = 'dadaf2279d901a5ba40';
             $this->appSecret = '828a03677a1c00a3a5b3c59209c4433d';
         }

+ 69 - 27
common/components/delivery/services/DispatchService.php

@@ -104,6 +104,29 @@ class DispatchService
         }
     }
 
+    public function validateOrder($order)
+    {
+        if(empty($order['address'])){
+            throw new \Exception('客户地址缺失');
+        }
+    
+        if(empty($order['long']) || empty($order['lat'])){
+            throw new \Exception('客户地址信息缺失');
+        }
+
+        if(empty($order['customName'])){
+            throw new \Exception('客户姓名缺失');
+        }
+
+        if(empty($order['city'])){
+            throw new \Exception('客户城市信息缺失');
+        }
+
+        if(empty($order['customMobile']) && empty($order['receiveMobile']) && empty($order['bookMobile'])){
+            throw new \Exception('客户联系电话缺失');
+        }
+    }
+
     /**
      * @param $order
      * @param string $orderType 订单类型:xhOrder 或 xhGhsOrder
@@ -227,7 +250,7 @@ class DispatchService
     }
 
     /**
-     * 获取所有平台的最佳报价(使用 Guzzle 并发请求)
+     * 获取所有平台的报价(使用 Guzzle 并发请求)
      * 
      * 流程说明:
      * 1. 同步准备各平台的前置数据(如城市信息、订单商品等)
@@ -236,19 +259,20 @@ class DispatchService
      * 
      * @param array $order 订单信息
      * @param array $shop 店铺信息
+     * @param string $pickupTime 取件时间
      * @return array 返回所有平台的报价结果
      */
-    public function getAllPlatformPrice($order, $shop, $orderTime)
+    public function getAllPlatformPrice($order, $shop, $pickupTime)
     {
         // 第一步:准备前置数据(同步进行,因为某些平台需要这些数据)
-        $preparedData = $this->preparePlatformData($order, $shop, $orderTime);
+        $preparedData = $this->preparePlatformData($order, $shop, $pickupTime);
 
         if (empty($preparedData)) {
             return ['error' => '所有平台数据准备失败'];
         }
 
         // 第二步:并发调用各平台的报价接口
-        $results = $this->concurrentGetPrices($preparedData, $orderTime);
+        $results = $this->concurrentGetPrices($preparedData, $pickupTime);
 
         if (empty($results['success']) && empty($results['failed'])) {
             return ['error' => '没有可用的物流平台'];
@@ -263,12 +287,12 @@ class DispatchService
 
     /**
      * 为各平台准备订单数据(前置数据同步获取)
-     * 
      * @param array $order 订单信息
      * @param array $shop 店铺信息
+     * @param string $pickupTime 取件时间
      * @return array 各平台的订单数据
      */
-    private function preparePlatformData($order, $shop, $orderTime)
+    private function preparePlatformData($order, $shop, $pickupTime)
     {
         $preparedData = [];
 
@@ -296,7 +320,7 @@ class DispatchService
         // 准备 Shansong 数据
         if (isset($this->adapters['shansong'])) {
             try {
-                $preparedData['shansong'] = $this->prepareShansongData($order, $shop, $orderTime);
+                $preparedData['shansong'] = $this->prepareShansongData($order, $shop, $pickupTime);
             } catch (\Exception $e) {
                 Yii::warning("Shansong 数据准备失败: {$e->getMessage()}");
             }
@@ -318,7 +342,7 @@ class DispatchService
                 if(in_array($isPersonDirect, [1, 2])){ // 支持专人直送
                     $customSettings = ['isPersonDirect' => 1];//自定义用户设置:专人直送
                     $preparedData['shunfeng_1v1'] = $this->prepareShunfengData($order, $shop, $customSettings);
-                    Yii::info('预创建订单 shunfeng_1v1 request data: ' . json_encode($preparedData['shunfeng_1v1']));
+                    // Yii::info('预创建订单 shunfeng_1v1 request data: ' . json_encode($preparedData['shunfeng_1v1']));
                 }
                 // else{
                 //     $customSettings = [];//自定义用户设置:默认不专人直送
@@ -334,7 +358,14 @@ class DispatchService
             try {
                 $dadaAdapter = $this->adapters['dada'];
                 $shopNo = $dadaAdapter->getShopNo();
-                $preparedData['dada'] = $this->prepareDadaData($order, $shop, $shopNo);
+
+                // 拼送
+                $customSettings = ['is_direct_delivery' => 0];
+                $preparedData['dada'] = $this->prepareDadaData($order, $shopNo, $customSettings);
+
+                // 专送
+                //$customSettings = ['is_direct_delivery' => 1];
+                //$preparedData['dada_1v1'] = $this->prepareDadaData($order, $shopNo, $customSettings);
             } catch (\Exception $e) {
                 Yii::warning("Dada 数据准备失败: {$e->getMessage()}");
             }
@@ -380,7 +411,7 @@ class DispatchService
         }
         $specReq = array_filter($specReq);
 
-        // 构建所车型数据
+        // 构建所车型数据
         $vehicleTypeList = [];
         foreach ($vehicleList as $vehicle) {
             if(!in_array($vehicle['vehicle_name'], ['跑腿', '小面', '微面'])){ // && !$this->adapters['huolala']->getIsSandbox()
@@ -463,13 +494,13 @@ class DispatchService
             'receiver_latitude' => (float)$order['lat'],
             'receiver_longitude' => (float)$order['long'],
             'receiver_address' => $order['fullAddress'],
-            'position_source' => 3,
+            'position_source' => 3, //坐标经纬度来源(1:腾讯地图,2:百度地图, 3:高德地图)
             'goods_count' => count($goodsItemList),
             'goods_weight' => (float)$order['weight'],
             'goods_total_amount_cent' => (int)($order['actPrice'] * 100),
             'goods_actual_amount_cent' => (int)($order['prePrice'] * 100),
             'goods_item_list' => $goodsItemList,
-            'order_type' => 1,
+            //'order_type' => 1,
             'chain_store_id' => $platformShopId, // 蜂鸟平台 shopId
             'order_remark' => $order['remark'] ?? '',
         ];
@@ -478,7 +509,7 @@ class DispatchService
     /**
      * 准备闪送订单数据
      */
-    private function prepareShansongData($order, $shop, $orderTime)
+    private function prepareShansongData($order, $shop, $pickupTime)
     {
         $data = [
             'platform' => 'shansong',
@@ -513,11 +544,15 @@ class DispatchService
             'sendNum' => $order['sendNum'],
         ];
 
-        $timestamp = strtotime($orderTime);
+        $timestamp = strtotime($pickupTime);
         $currentTime = time() + 3600;
         if($timestamp > $currentTime){
-            $data['appointType'] = 1; // 修改预约类型
-            $data['appointmentDate'] = $orderTime; // 预约时间, yyyy-MM-dd HH:mm格式(例如:2020-02-02 22:00),指的是预约取件时间,只支持一个小时以后两天以内
+            $data['appointType'] = 1; // 修改成 1预约单
+            $data['appointmentDate'] = $pickupTime; // 预约时间, yyyy-MM-dd HH:mm格式(例如:2020-02-02 22:00),指的是预约取件时间,只支持一个小时以后
+            //两天以内
+            if($timestamp > time() + 172800){
+                throw new \Exception('取件时间不能超过两天');
+            }
 
             // 'expectStartTime' 期望送达时间起始时间  -- 毫秒级时间戳。期望送达时间为时间点时,无需传本参数;期望送达时间为时间段时,期望送达时间为expectStartTime至expectEndTime
             // 'expectEndTime'  期望送达时间终止时间 -- 毫秒级时间戳。期望送达时间为时间点时,只需传本参数;期望送达时间为时间段时,期望送达时间为expectStartTime至expectEndTime
@@ -555,7 +590,7 @@ class DispatchService
             'user_lat' => (string)$order['lat'],                     // 用户地址纬度
             'user_address' => $order['fullAddress'],                 // 用户详细地址
             'weight' => $order['weight'] * 1000,                     // 物品重量(单位:克)
-            'product_type' => 14,                                     // 物品类型(14:鲜花)
+            'product_type' => 14,                                    // 物品类型(14:鲜花)
             'push_time' => time(),                                   // 推单时间(秒级时间戳)
             //shop 平台级开发者需要传入
             // 'shop' => [                                              // 发货店铺信息
@@ -578,7 +613,7 @@ class DispatchService
             'lbs_type' => 2,                                         // 坐标类型(2:高德坐标)
             'is_insured' => 0,                                       // 是否保价(0:非保价)
             'is_person_direct' => $customSettings['isPersonDirect'] ?? 0, // 是否专人直送(0:否  1:是)
-            'vehicle' => 0,                                          // 配送交通工具(0:否)
+            'vehicle' => 0,                                          // 配送交通工具,0:否;1:电动车;2:小轿车
             //'four_wheeler_type' => 0,                                // 车型 -- 只有vehicle = 2,⻋型字段才有效。
             //'declared_value' => 0,                                   // 保价金额(单位:分)
             //'gratuity_fee' => 0,                                     // 订单小费(单位:分)
@@ -591,7 +626,7 @@ class DispatchService
     /**
      * 准备达达订单数据
      */
-    private function prepareDadaData($order, $shop, $shopNo)
+    private function prepareDadaData($order, $shopNo, $customSettings)
     {
         $productList = [];
         $itemInfos = OrderItemClass::getAllByCondition(['orderSn' => $order['orderSn']], null, 'id, name, unitPrice, num, bigNum, smallNum, xhUnitName');
@@ -607,7 +642,7 @@ class DispatchService
         // 回调地址
         $callbackUrl = Yii::$app->params['ghsHost'] . '/delivery/dada-callback';
 
-        return [
+        $request = [
             'platform' => 'dada',
             'shop_no' => $shopNo,
             'origin_id' => $order['orderSn'],
@@ -624,6 +659,13 @@ class DispatchService
             'info' => $order['remark'] ?? '',
             'product_list' => $productList,
         ];
+
+        if(isset($customSettings['is_direct_delivery']) && $customSettings['is_direct_delivery'] == 1){
+            // $request['origin_id'] = $order['orderSn'] . '_1v1'; // 根据达达的情况,必然会造成订单号出错
+            $request['is_direct_delivery'] = 1; //是否选择直拿直送(0:不需要;1:需要。选择直拿直送后,同一时间骑士只能配送此订单至完成,同时,也会相应的增加配送费用)
+        }
+
+        return $request;
     }
 
     /**
@@ -659,7 +701,7 @@ class DispatchService
     /**
      * 并发获取各平台报价(核心实现)
      * 
-     * 使用 HttpClient::postConcurrent 实现真正的并发调用,每个平台请求 5 秒超时。
+     * 使用 HttpClient::postConcurrent 实现真正的并发调用,每个平台请求 10 秒超时。
      * 某个平台的超时或失败不会影响其他平台的执行。
      * 
      * @param array $preparedData 准备好的各平台数据
@@ -682,8 +724,8 @@ class DispatchService
                 $adapterKey = $platform; //由于要支持特殊逻辑处理,把 $this->adapters[xxx] 的 xxx 单独取变量
 
                 if (!isset($this->adapters[$platform])) {
-                    if($platform == 'shunfeng_1v1'){ //特殊处理 -- 专人直送的订单,使用顺丰平台适配器
-                        $adapterKey = 'shunfeng';
+                    if (substr($platform, -4) === '_1v1') { //特殊处理 -- 专人直送的订单,使用对应平台适配器
+                        $adapterKey = substr($platform, 0, -4);
                     } else {
                         $results['failed'][$platform] = '平台适配器未初始化';
                         Yii::warning("[DispatchService] {$platform} 平台适配器未初始化");
@@ -735,8 +777,8 @@ class DispatchService
 
             try {
                 $adapterKey = $platform; //由于要支持特殊逻辑处理,把 $this->adapters[xxx] 的 xxx 单独取变量
-                if($platform == 'shunfeng_1v1'){ //特殊处理 -- 专人直送的订单,使用顺丰平台适配器
-                    $adapterKey = 'shunfeng';
+                if (substr($platform, -4) === '_1v1') { //特殊处理 -- 专人直送的订单,使用对应平台适配器
+                    $adapterKey = substr($platform, 0, -4);
                 }
                 $adapter = $this->adapters[$adapterKey];
                 $quote = null;
@@ -768,7 +810,7 @@ class DispatchService
                         Yii::warning("[DispatchService] {$platform} 报价返回错误: {$errorMsg}");
                     }
                 } else {
-                    // 蜂鸟和闪送的响应处理
+                    // 响应处理
                     $quote = $adapter->processPriceResponse($response);
                     if ($quote && !isset($quote['error'])) {
                         $quote['_duration'] = $totalDuration;
@@ -980,7 +1022,7 @@ class DispatchService
                     break;
                 case 'dada':
                     $list = [
-                        'name' => '达达',
+                        'name' => '达达'. ($platformKey == 'dada_1v1' ? ' (专送)' : ''),
                         'en_name' => 'dada',
                         'price' => $item['fee'],
                         'distance' => $item['distance'],

+ 2 - 2
common/components/delivery/services/adapter/DadaAdapter.php

@@ -302,7 +302,7 @@ class DadaAdapter extends Dada implements Adapter
     }
 
     /**
-     * 重新下单
+     * 重新下单 -- /api/order/reAddOrder
      * 同一个商户的单号(根据三方单号识别)如果已经在达达侧创建了订单,在该订单被取消(已取消=5)、拒收返还(妥投异常物品返还完成=10)后,可以调用该接口重发订单,达达将根据传入的配送信息重新计算运费并创建达达物流订单。
      * @param string $deliveryNo
      * @param string $orderId 第三方订单ID
@@ -627,7 +627,7 @@ class DadaAdapter extends Dada implements Adapter
             // 预约发单时间(unix时间戳(10位),精确到分),可以支持未来3天内的订单发预约单,如预约发单时间早于当前时间会作为即时单下发。
             $apiData['delay_publish_time'] = $ts;
             $apiData['is_expect_finish_order'] = 1; // 是否根据期望送达时间预约发单(0-否,即时发单;1-是,预约发单),如传1则期望送达时间必传。
-            $apiData['expect_finish_time_limit'] = $ts; // 期望送达时间(单位秒,不早于当前时间)
+            $apiData['expect_finish_time_limit'] = $ts + 3000; // 期望送达时间(单位秒)== 预约发单时间 + 50分钟
         }
 
         // 添加可选参数

+ 6 - 29
common/components/delivery/services/adapter/DidiAdapter.php

@@ -30,12 +30,11 @@ class DidiAdapter extends Didi implements Adapter
 
     /**
      * 构建订单计费请求信息(供并发请求使用)
-     * 
      * @param array $data 订单数据
-     * @param string $orderTime 配送时间
+     * @param string $pickupTime 取件时间
      * @return array 包含 url, data, headers, timeout 的请求信息
      */
-    public function buildPriceRequest($data, $orderTime)
+    public function buildPriceRequest($data, $pickupTime)
     {
         $sender = $data['sender'];
         // 滴滴目前主要支持单点对单点,取第一个收件人
@@ -91,24 +90,6 @@ class DidiAdapter extends Didi implements Adapter
                 //'serviceType' => 1,
             ],
         ];
-        // 如果是预约单,则使用以下 拉货(普通货运)
-        $laHuo_serviceCategoryList = [
-            [
-                'bizType' => 0,      // 业务类型 -- 普通货运
-                'carType' => 1020,   // 车型 -- 三轮车
-                'serviceLevel' => 0, // 服服务等级
-            ],
-            [
-                'bizType' => 0,
-                'carType' => 1012,   // 微面
-                'serviceLevel' => 0,
-            ],
-            [
-                'bizType' => 0,
-                'carType' => 1001,   // 车型 -- 小面包
-                'serviceLevel' => 0,
-            ],
-        ];
         //$ret = $this->queryCityInfo(null,  (float)$receiver['toLongitude'], (float)$receiver['toLatitude']);
 
         // 构造起点信息
@@ -145,15 +126,11 @@ class DidiAdapter extends Didi implements Adapter
         // 预约单处理
         $modeType = 1; // 1-实时单
         $useTime = null;
-        if ($orderTime) {
-            $ts = strtotime($orderTime);
-            if ($ts > (time() + 300)) { // 5分钟后算预约? 滴滴快送暂不支持预约单,这里保留逻辑备用
+        if ($pickupTime) {
+            $ts = strtotime($pickupTime);
+            if ($ts > (time() + 300)) { // 5分钟后算预约? 滴滴快送暂不支持预约单,只能应用于普通货运
                 $modeType = 2;// 变更为2-预约单
                 $useTime = $ts * 1000;
-                // 注意:文档说“快送暂不支持预约单都按照实时单处理”,所以这里可能无需处理,或者传了也没用
-
-                //从快送 变更 拉货
-                //$serviceCategoryList = $laHuo_serviceCategoryList;
             }
         }
 
@@ -166,7 +143,7 @@ class DidiAdapter extends Didi implements Adapter
             'goodsType' => $goodsType,
             'weight' => $weightGram,
             'needPickupCode' => false,
-            'needReceiveCode' => true, // 通常需要收件码
+            'needReceiveCode' => false,
             'modeType' => $modeType,
         ];
 

+ 11 - 11
common/components/delivery/services/adapter/HuolalaAdapter.php

@@ -341,14 +341,14 @@ class HuolalaAdapter extends Huolala implements Adapter
             if (!empty($vehicle['addr_info']) && is_array($vehicle['addr_info'])) {
                 foreach ($vehicle['addr_info'] as $addr) {
                     $addrInfo[] = [
-                        'name' => $addr['name'] ?? '',
-                        'addr' => $addr['addr'] ?? '',
-                        'city_id' => (int)($addr['city_id'] ?? 0),
-                        'city_name' => $addr['city_name'] ?? '',
-                        'district_name' => $addr['district_name'] ?? '',
-                        'house_number' => $addr['house_number'] ?? '',
-                        'contacts_name' => $addr['contacts_name'] ?? '',
-                        'contacts_phone_no' => $addr['contacts_phone_no'] ?? '',
+                        'name' => $addr['name'],
+                        'addr' => $addr['addr'],
+                        'city_id' => (int)$addr['city_id'],
+                        'city_name' => $addr['city_name'],
+                        'district_name' => $addr['district_name'],
+                        'house_number' => $addr['house_number'],
+                        'contacts_name' => $addr['contacts_name'],
+                        'contacts_phone_no' => $addr['contacts_phone_no'],
                         'lat_lon' => [
                             'lat' => (double)($addr['lat_lon']['lat'] ?? 0),
                             'lon' => (double)($addr['lat_lon']['lon'] ?? 0),
@@ -358,9 +358,9 @@ class HuolalaAdapter extends Huolala implements Adapter
             }
             
             $apiData = [
-                'city_id' => (int)($data['city_id'] ?? 0),
-                'order_vehicle_id' => (int)($vehicle['order_vehicle_id'] ?? 0),
-                'city_info_revision' => (int)($vehicle['city_info_revision'] ?? 0),
+                'city_id' => (int)$data['city_id'],
+                'order_vehicle_id' => (int)$vehicle['order_vehicle_id'],
+                'city_info_revision' => (int)$vehicle['city_info_revision'],
                 'order_time' => $orderTime,
                 'addr_info' => $addrInfo,
             ];

+ 12 - 13
common/components/delivery/services/adapter/ShansongAdapter.php

@@ -96,18 +96,17 @@ class ShansongAdapter extends Shansong implements Adapter
 
     /**
      * 构建订单计费请求信息(供并发请求使用)
-     * 
      * @param array $data 订单数据
-     * @param string $orderTime 配送时间
+     * @param string $pickupTime 取件时间
      * @return array 包含 url, data, headers, timeout 的请求信息
      */
-    public function buildPriceRequest($data, $orderTime)
+    public function buildPriceRequest($data, $pickupTime)
     {
         // 预约类型
-        $timeDiff = strtotime($orderTime) - time();
-        $appointType = 0;
+        $timeDiff = strtotime($pickupTime) - time();
+        $appointType = 0; //0立即单
         if ($timeDiff > 3600 ) {
-            $appointType = 1;
+            $appointType = 1; //1预约单
         }
 
         // 构建发件人信息
@@ -126,12 +125,12 @@ class ShansongAdapter extends Shansong implements Adapter
         foreach ($data['receiverList'] as $receiver) {
             $receiverList[] = [
                 'orderNo' => $receiver['orderNo'],
-                'toAddress' => $receiver['toAddress'] ?? '',
-                'toAddressDetail' => $receiver['toAddressDetail'] ?? '',
-                'toReceiverName' => $receiver['toReceiverName'] ?? '',
-                'toMobile' => $receiver['toMobile'] ?? '',
-                'toLatitude' => $receiver['toLatitude'] ?? '',
-                'toLongitude' => $receiver['toLongitude'] ?? '',
+                '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'] ?? '', // 备注
@@ -164,7 +163,7 @@ class ShansongAdapter extends Shansong implements Adapter
         // 如果有预约日期,添加到请求体
         if ($appointType == 1) {
             // yyyy-MM-dd HH:mm格式(例如:2020-02-02 22:00),指的是预约取件时间,只支持一个小时以后两天以内
-            $requestData['appointmentDate'] = $orderTime;
+            $requestData['appointmentDate'] = $pickupTime;
         }
         $requestData = $this->filterEmptyValues($requestData);
         $requestData = json_encode($requestData, JSON_UNESCAPED_UNICODE);

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

@@ -412,7 +412,7 @@ class ShunfengAdapter extends Shunfeng implements Adapter
                 // 还有其它返回值没加进来
             ];
         } else {
-            Yii::error('shunfeng 报价失败:'.json_encode($resp));
+            Yii::error('shunfeng 报价失败:'.json_encode($resp, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES));
             return [
                 'platform' => 'shunfeng',
                 'error' => isset($resp['error_msg']) ? $resp['error_msg'] : '',
@@ -422,16 +422,21 @@ class ShunfengAdapter extends Shunfeng implements Adapter
 
     /**
      * 构建运费报价请求信息(供并发请求使用)
-     *
      * @param array $data 报价参数
-     * @param string $orderTime 配送时间
+     * @param string $pickupTime 取件时间
      * @return array|null 包含 url, payload, headers, timeout 的请求信息
      */
-    public function buildPriceRequest($data, $orderTime)
+    public function buildPriceRequest($data, $pickupTime)
     {
         unset($data['platform']);
-        // 根据 $orderTime ,调整 $data 中的部分参数
-
+        
+        // 根据 $pickupTime ,调整 $data 中的部分参数
+        $timestamp = strtotime($pickupTime);
+        if($timestamp > time() + 300){ // 5分钟后算预约单
+            $data['is_appoint'] = 1; // 是否预约单(0:非预约单;1:预约单)-- 修改为预约单
+            $data['appoint_type'] = 2; // 预约类型 -- 1:预约送达单;2:预约上门单 (预约单的时候传入,即时单的时候不传)
+            $data['expect_pickup_time'] = $timestamp; // 期望取件时间(秒级时间戳)
+        }
 
         // 构建签名用的完整payload
         $payload = [
@@ -451,7 +456,7 @@ class ShunfengAdapter extends Shunfeng implements Adapter
             'timeout' => 10.0,
         ];
 
-        Yii::info('顺丰构建运费报价请求信息 -- ' .json_encode($request, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES));
+        // Yii::info('顺丰构建运费报价请求信息 -- ' .json_encode($request, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES));
         return $request;
     }