|
|
@@ -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
|
|
|
];
|
|
|
}
|
|
|
|
|
|
-}
|
|
|
+}
|