Explorar el Código

达达 DadaAdapter.php 实现formatOrderData函数

shizhongqi hace 8 meses
padre
commit
2ada9b3ae2

+ 26 - 9
app-ghs/controllers/DeliveryController.php

@@ -760,17 +760,34 @@ class DeliveryController extends BaseController
         $get = Yii::$app->request->get();
         $getData = json_encode($get, JSON_UNESCAPED_UNICODE);
         Yii::info($getData);
-        // // 用merchanId 来保存 sourceId
+        // {"sourceId":"1003654","ticket":"b8b4e56a86934b73a512ea9994e7774e","state":"huidiao_biaoshi","shopNo":"1003654-88547413"}
+        // 用merchanId 来保存 sourceId
+        if($getData['state'] != 'huidiao_biaoshi'){
+            Yii::error('达达授权回调 state 参数不对');
+            return;
+        }
+        if(!isset($getData['mainId'])){
+            Yii::error('达达授权回调缺少必要参数 mainId');
+            return;
+        }
 
-        $callbackData = Yii::$app->request->post();
-        if (empty($callbackData)) {
-            $postStr = file_get_contents('php://input');
-            $callbackData = json_decode($postStr, true);
-            if (empty($callbackData)) {
-                Yii::info('回调请求的数据为空');
-            }
+        try {
+            // 保存授权信息到数据库
+            $data = [
+                'mainId' => $getData['mainId'],
+                'merchantId' => $getData['sourceId'], // 用merchanId 来保存 sourceId
+                'shopId' => $getData['shopNo'],
+                'accessToken' => '',
+                'refreshToken' => '',
+                'expiresAt' => 9997773456,
+                'authType' => 'all_store', //即 scope='all'
+                'platform' => 'dada'
+            ];
+            DeliveryAuthTokenClass::add($data);
+            Yii::info('达达授权回调保存成功', 'dada');
+        }catch(\Exception $e){
+            Yii::error('达达授权回调保存失败' . $e->getMessage(), 'dada');
         }
-        Yii::info('达达授权回调:' . json_encode($callbackData, JSON_UNESCAPED_UNICODE), 'dada');
     }
 
     /**

+ 100 - 46
common/components/delivery/services/adapter/DadaAdapter.php

@@ -1,8 +1,11 @@
 <?php
 namespace common\components\delivery\services\adapter;
 
+use bizGhs\order\classes\OrderItemClass;
+use bizHd\order\classes\OrderGoodsClass;
 use common\components\delivery\helpers\HttpClient;
 use common\components\delivery\platform\dada\Dada;
+use common\components\util;
 use Yii;
 
 /**
@@ -52,28 +55,76 @@ class DadaAdapter extends Dada implements Adapter
         return $resp;
     }
 
+    /**
+     * 转化订单数据
+     * @param $order
+     * @param string $type 订单类型:xhOrder 或 xhGhsOrder
+     * @param $shop
+     * @param $params
+     * @return array
+     * @throws \Exception
+     */
+    public function formatOrderData($order, $type, $shop, $params)
+    {
+        $shopNo = $this->shopNo;
+        if(empty($shopNo)){
+            util::fail("DadaAdapter formatOrderData shopNo is empty");
+        }
+
+        $productList = [];
+        if($type == 'xhGhsOrder'){
+            $itemInfos = OrderItemClass::getAllByCondition(['orderSn' => $order['orderSn']], null, 'id, name, unitPrice, num, xhUnitName');
+            foreach ($itemInfos as $item){
+                $productList[] = [
+                    'sku_name' => $item['name'],
+                    'src_product_no' => (string)$item['id'],
+                    'count' => (float)$item['num'],
+                    'unit' => $item['xhUnitName'],
+                ];
+            }
+        } else if($type == 'xhOrder'){
+            $itemInfos = OrderGoodsClass::getAllByCondition(['orderSn' => $order['orderSn']], null, 'id, name, unitPrice, num');
+            foreach ($itemInfos as $item){
+                $productList[] = [
+                    'sku_name' => $item['name'],
+                    'src_product_no' => (string)$item['id'],
+                    'count' => (float)$item['num'],
+                    'unit' => '件',
+                ];
+            }
+        } else {
+            Yii::error('订单编号出错: '.$order['orderSn']);
+            util::fail('订单编号出错');
+        }
+
+        // 默认回调地址
+        $callbackUrl = Yii::$app->params['dada_callback'] ?? 'https://api.shop.hzghd.com/delivery/dada-callback';
+
+        return [
+            'order_id' => $order['orderSn'],
+            'origin_id' => $order['orderSn'], // 达达API通常使用 origin_id
+            'shop_no' => $shopNo,
+            'receiver_name' => $order['customName'],
+            'receiver_address' => $order['fullAddress'],
+            'receiver_phone' => Functions::getMobile($order),
+            'receiver_lat' => (float)$order['lat'],
+            'receiver_lng' => (float)$order['long'],
+            'cargo_price' => (float)$order['actPrice'], // 单位:元
+            'tips' => 0,
+            'info' => $order['remark'] ?? '',
+            'callback' => $callbackUrl,
+            'cargo_weight' => isset($order['weight']) ? (float)$order['weight'] : 1.0,
+            'product_list' => $productList,
+            'is_prepay' => 0, // 是否需要垫付
+        ];
+    }
+
     /**
      * 创建订单(指派订单给配送员)
      * 
      * 根据达达官方文档实现下单功能
      * 
-     * @param array $data 订单数据,结构参考:
-     *   [
-     *       'order_id' => '订单编号' (必需),           // 商户系统内部订单编号
-     *       'shop_no' => '门店编号' (必需),           // 门店编号
-     *       'transporter_id' => 配送员ID (必需),      // 指定配送员ID(可选,为空则由系统自动分配)
-     *       'receiver_name' => '收货人名称' (可选),
-     *       'receiver_address' => '收货地址' (可选),
-     *       'receiver_phone' => '收货人电话' (可选),
-     *       'receiver_lng' => 经度 (可选),
-     *       'receiver_lat' => 纬度 (可选),
-     *       'cargo_price' => 货物价格(分) (可选),
-     *       'tips' => 小费(分) (可选),
-     *       'distance' => 距离(米) (可选),
-     *       'prepare_time' => 商品准备时间 (可选),    // 单位:秒
-     *       'remark' => '备注' (可选),
-     *       'callback' => '回调地址' (可选),
-     *   ]
+     * @param array $data 订单数据
      * @return array API 响应结果
      */
     public function createOrder($data)
@@ -87,9 +138,19 @@ class DadaAdapter extends Dada implements Adapter
         }
 
         // 构建业务参数(按达达 API 规范)
+        // 达达新增订单接口(orderAddRequest)主要参数:shop_no, origin_id, ...
         $apiData = [
-            'order_id' => $data['order_id'],
             'shop_no' => $data['shop_no'],
+            'origin_id' => $data['origin_id'] ?? $data['order_id'], // 优先使用 origin_id
+            'city_code' => '', // 可选
+            'cargo_price' => isset($data['cargo_price']) ? (float)$data['cargo_price'] : 0,
+            'is_prepay' => isset($data['is_prepay']) ? (int)$data['is_prepay'] : 0,
+            'receiver_name' => $data['receiver_name'] ?? '',
+            'receiver_address' => $data['receiver_address'] ?? '',
+            'receiver_phone' => $data['receiver_phone'] ?? '',
+            'receiver_lat' => isset($data['receiver_lat']) ? (double)$data['receiver_lat'] : 0,
+            'receiver_lng' => isset($data['receiver_lng']) ? (double)$data['receiver_lng'] : 0,
+            'callback' => $data['callback'] ?? '',
         ];
 
         // 如果指定了配送员ID,添加到请求
@@ -97,39 +158,27 @@ class DadaAdapter extends Dada implements Adapter
             $apiData['transporter_id'] = (int)$data['transporter_id'];
         }
 
-        // 可选参数
-        if (!empty($data['receiver_name'])) {
-            $apiData['receiver_name'] = $data['receiver_name'];
-        }
-        if (!empty($data['receiver_address'])) {
-            $apiData['receiver_address'] = $data['receiver_address'];
-        }
-        if (!empty($data['receiver_phone'])) {
-            $apiData['receiver_phone'] = $data['receiver_phone'];
-        }
-        if (isset($data['receiver_lng']) && $data['receiver_lng'] !== '') {
-            $apiData['receiver_lng'] = (double)$data['receiver_lng'];
-        }
-        if (isset($data['receiver_lat']) && $data['receiver_lat'] !== '') {
-            $apiData['receiver_lat'] = (double)$data['receiver_lat'];
-        }
-        if (isset($data['cargo_price'])) {
-            $apiData['cargo_price'] = (int)$data['cargo_price'];
-        }
         if (isset($data['tips'])) {
-            $apiData['tips'] = (int)$data['tips'];
+            $apiData['tips'] = (float)$data['tips'];
         }
         if (isset($data['distance'])) {
-            $apiData['distance'] = (int)$data['distance'];
+            $apiData['distance'] = (double)$data['distance'];
         }
-        if (isset($data['prepare_time'])) {
-            $apiData['prepare_time'] = (int)$data['prepare_time'];
+        if (isset($data['prepare_time'])) { // 废弃字段,但保留兼容
+            //$apiData['prepare_time'] = (int)$data['prepare_time'];
         }
-        if (!empty($data['remark'])) {
-            $apiData['remark'] = $data['remark'];
+        if (!empty($data['info'])) { // 订单备注
+            $apiData['info'] = $data['info'];
+        } elseif (!empty($data['remark'])) {
+            $apiData['info'] = $data['remark'];
+        }
+
+        if (isset($data['cargo_weight'])) {
+            $apiData['cargo_weight'] = (double)$data['cargo_weight'];
         }
-        if (!empty($data['callback'])) {
-            $apiData['callback'] = $data['callback'];
+        
+        if (isset($data['product_list'])) {
+            $apiData['product_list'] = $data['product_list'];
         }
 
         // 将业务参数转换为 JSON 字符串
@@ -144,6 +193,11 @@ class DadaAdapter extends Dada implements Adapter
         return $resp;
     }
 
+    public function cancelOrder($orderId, $params)
+    {
+
+    }
+
     /**
      * 获取订单运费报价
      * 
@@ -350,4 +404,4 @@ class DadaAdapter extends Dada implements Adapter
         ];
     }
 
-}
+}