Răsfoiți Sursa

达达跑腿要区分首次发单与非首次发发单

shizhongqi 7 luni în urmă
părinte
comite
144bf252da

+ 1 - 1
app-ghs/controllers/DeliveryController.php

@@ -272,7 +272,7 @@ class DeliveryController extends BaseController
         if ($ghsOrder->mainId != $this->mainId) {
             util::fail('不是你的订单');
         }
-        if (!in_array($ghsOrder['sendStatus'], [-4, -1])) {
+        if (!in_array($ghsOrder['sendStatus'], [-4, -2, -1])) {
             Yii::error('订单已经发过跑腿');
             util::fail('订单已经发过跑腿');
         }

+ 1 - 1
app-ghs/models/delivery/CreateOrderForm.php

@@ -23,7 +23,7 @@ class CreateOrderForm extends BaseForm
         return [
             [['orderId', 'weight', 'price'], 'required'],
             [['orderId', 'weight', 'price'], 'integer'],
-            ['orderId', 'validateOrderId'],
+            //['orderId', 'validateOrderId'],
             ['pickupTime', 'safe'],
             ['allParams', 'safe'],
             ['remark', 'string', 'max' => 100],

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

@@ -183,7 +183,7 @@ class DeliveryController extends BaseController
         if ($Order->mainId != $this->mainId) {
             util::fail('不是你的订单');
         }
-        if (!in_array($Order['sendStatus'], [-4, -1])) {
+        if (!in_array($Order['sendStatus'], [-4, -2, -1])) {
             Yii::error('订单已经发过跑腿');
             util::fail('订单已经发过跑腿');
         }

+ 1 - 1
app-hd/models/delivery/CreateOrderForm.php

@@ -22,7 +22,7 @@ class CreateOrderForm extends BaseForm
         return [
             [['orderId', 'price'], 'required'],
             [['orderId', 'price'], 'integer'],
-            ['orderId', 'validateOrderId'],
+            //['orderId', 'validateOrderId'],
             ['pickupTime', 'safe'],
             ['allParams', 'safe'],
             ['remark', 'string', 'max' => 500],

+ 108 - 11
common/components/delivery/services/adapter/DadaAdapter.php

@@ -1,7 +1,9 @@
 <?php
 namespace common\components\delivery\services\adapter;
 
+use bizGhs\express\classes\GhsDeliveryOrderClass;
 use bizGhs\order\classes\OrderItemClass;
+use bizHd\express\classes\HdDeliveryOrderClass;
 use bizHd\order\classes\OrderGoodsClass;
 use common\components\delivery\helpers\HttpClient;
 use common\components\delivery\platform\dada\Dada;
@@ -38,18 +40,41 @@ class DadaAdapter extends Dada implements Adapter
     /**
      * 转化订单数据
      * @param $order
-     * @param string $type 订单类型:xhOrder 或 xhGhsOrder
+     * @param string $orderType 订单类型:xhOrder 或 xhGhsOrder
      * @param $shop
      * @param $params
      * @return array
      * @throws \Exception
      */
-    public function formatOrderData($order, $type, $shop, $params)
+    public function formatOrderData($order, $orderType, $shop, $params)
     {
+        $hasOldOrder = false;
+        if($orderType == 'xhOrder'){
+            $deliveryOrders = HdDeliveryOrderClass::getByCondition([
+                'deliveryId' => 'dada',
+                'hdOrderId' => $order['id']
+            ], 'id DESC', 'id,mainId,orderId');
+            if(count($deliveryOrders) >= 1) {
+                $hasOldOrder = true;
+            }
+        } elseif($orderType == 'xhGhsOrder') {
+            // 查找批发配送订单
+            $deliveryOrders = GhsDeliveryOrderClass::getAllByCondition([
+                'deliveryId' => 'dada',
+                'ghsOrderId' => $order['id']
+            ], 'id DESC', 'id,mainId,orderId');
+            if(count($deliveryOrders) >= 1) {
+                $hasOldOrder = true;
+            }
+        }
+
         $orderData = [
-            'deliveryNo' =>  $params['deliveryNo'],
+            'deliveryNo' => $params['deliveryNo'],
             'fee' => $params['price'],
             'distance' => $params['distance'],
+            'hasOldOrder' => $hasOldOrder,
+            'orderSn' => $order['orderSn'],
+            'params' => $hasOldOrder ? $this->formatOrderDataByResourceData($order, $orderType, $shop, $params) : [],
         ];
         return $orderData;
     }
@@ -57,13 +82,13 @@ class DadaAdapter extends Dada implements Adapter
     /**
      * 转化订单数据
      * @param $order
-     * @param string $type 订单类型:xhOrder 或 xhGhsOrder
+     * @param string $orderType 订单类型:xhOrder 或 xhGhsOrder
      * @param $shop
      * @param $params
      * @return array
      * @throws \Exception
      */
-    public function formatOrderDataByResourceData($order, $type, $shop, $params)
+    public function formatOrderDataByResourceData($order, $orderType, $shop, $params)
     {
         $shopNo = $this->shopNo;
         if(empty($shopNo)){
@@ -71,7 +96,7 @@ class DadaAdapter extends Dada implements Adapter
         }
 
         $productList = [];
-        if($type == 'xhGhsOrder'){
+        if($orderType == 'xhGhsOrder'){
             $itemInfos = OrderItemClass::getAllByCondition(['orderSn' => $order['orderSn']], null, 'id, name, unitPrice, num, xhUnitName');
             foreach ($itemInfos as $item){
                 $productList[] = [
@@ -81,7 +106,7 @@ class DadaAdapter extends Dada implements Adapter
                     'unit' => $item['xhUnitName'],
                 ];
             }
-        } else if($type == 'xhOrder'){
+        } else if($orderType == 'xhOrder'){
             $itemInfos = OrderGoodsClass::getAllByCondition(['orderSn' => $order['orderSn']], null, 'id, name, unitPrice, num');
             foreach ($itemInfos as $item){
                 $productList[] = [
@@ -115,6 +140,7 @@ class DadaAdapter extends Dada implements Adapter
             'cargo_weight' => isset($params['weight']) ? (float)$params['weight'] : 1.0,
             'product_list' => $productList,
             'is_prepay' => 0, // 是否需要垫付
+            'pickupTime' => $params['pickupTime'],
         ];
     }
 
@@ -124,6 +150,25 @@ class DadaAdapter extends Dada implements Adapter
      * @return array
      */
     public function createOrder($data)
+    {
+        if($data['hasOldOrder']){
+            $deliveryNo = $data['deliveryNo'];
+            $orderId = $data['orderSn'];
+            $params = $data['params'];
+            $ret = $this->reCreateOrder($deliveryNo, $orderId, $params);
+        }else{
+            $ret = $this->firstCreateOrder($data);
+        }
+
+        return $ret;
+    }
+
+    /**
+     * 查询运费后下单 -- addAfterQuery
+     * @param array $data 包含 deliveryNo 等参数
+     * @return array
+     */
+    public function firstCreateOrder($data)
     {
         // 验证必需字段
         if (empty($data['deliveryNo'])) {
@@ -156,7 +201,10 @@ class DadaAdapter extends Dada implements Adapter
                     'orderId' => $data['deliveryNo'],
                     'deliveryNo' => $data['deliveryNo'],
                     'fee' => $data['fee'],
-                    'distance' => $data['distance']
+                    'distance' => $data['distance'],
+                    'deliverFee' => $data['deliverFee'],
+                    'couponName' => $data['couponName'] ?? '',
+                    'couponFee' => $data['couponFee'] ?? 0,
                 ],
             ];
         }
@@ -237,14 +285,32 @@ class DadaAdapter extends Dada implements Adapter
         // 发送 POST 请求
         $resp = HttpClient::post("{$this->baseUrl}/orderAddRequest", $payload);
 
-        return $resp;
+        if(isset($resp['code']) && $resp['code'] == 0){
+            return [
+                'code' => 0,
+                'platform' => 'dada',
+                'data' => [
+                    'orderId' => $resp['order_id'],
+                ],
+            ];
+        }
+
+        return [
+            'code' => $resp['code'] ?? -1,
+            'msg' => $resp['msg'] ?? 'Unknown error',
+            'data' => null
+        ];
     }
 
     /**
      * 重新下单
      * 同一个商户的单号(根据三方单号识别)如果已经在达达侧创建了订单,在该订单被取消(已取消=5)、拒收返还(妥投异常物品返还完成=10)后,可以调用该接口重发订单,达达将根据传入的配送信息重新计算运费并创建达达物流订单。
+     * @param string $deliveryNo
+     * @param string $orderId 第三方订单ID
+     * @param array $params
+     * @return array
      */
-    public function reCreateOrder($orderId, $params)
+    public function reCreateOrder($deliveryNo, $orderId, $params)
     {
         // 验证必需字段
         if (empty($orderId) || empty($params['shop_no'])) {
@@ -283,6 +349,16 @@ class DadaAdapter extends Dada implements Adapter
                 $apiData[$field] = $params[$field];
             }
         }
+
+        // 处理预约单
+        $ts = strtotime($params['pickupTime']);
+        if ($ts > time() + 30) {
+            // delay_publish_time
+            // 预约发单时间(unix时间戳(10位),精确到分),可以支持未来3天内的订单发预约单,如预约发单时间早于当前时间会作为即时单下发。
+            $apiData['delay_publish_time'] = $ts;
+            $apiData['is_expect_finish_order'] = 1; // 是否根据期望送达时间预约发单(0-否,即时发单;1-是,预约发单),如传1则期望送达时间必传。
+            $apiData['expect_finish_time_limit'] = $ts; // 期望送达时间(单位秒,不早于当前时间)
+        }
         
         // 特殊处理:如果 info 没传但有 remark,尝试使用 remark
         if (!isset($apiData['info']) && !empty($params['remark'])) {
@@ -293,7 +369,28 @@ class DadaAdapter extends Dada implements Adapter
         $payload = $this->buildRequestPayload('api/order/reAddOrder', $body);
         $resp = HttpClient::post("{$this->baseUrl}/api/order/reAddOrder", $payload);
 
-        return $resp;
+        if(isset($resp['code']) && $resp['code'] == 0){
+            $data = $resp['result'];
+            return [
+                'code' => 0,
+                'platform' => 'dada',
+                'data' => [
+                    'orderId' => $deliveryNo,
+                    'deliveryNo' => $deliveryNo,
+                    'fee' => $data['fee'],
+                    'distance' => $data['distance'],
+                    'deliverFee' => $data['deliverFee'],
+                    'couponName' => $data['couponName'] ?? '',
+                    'couponFee' => $data['couponFee'] ?? 0,
+                ],
+            ];
+        }
+
+        return [
+            'code' => $resp['code'] ?? -1,
+            'msg' => $resp['msg'] ?? 'Unknown error',
+            'data' => null
+        ];
     }
 
     /**