|
|
@@ -1,6 +1,9 @@
|
|
|
<?php
|
|
|
namespace common\components\delivery\services\adapter;
|
|
|
|
|
|
+use bizGhs\express\classes\DeliveryOrderClass;
|
|
|
+use bizGhs\express\classes\GhsDeliveryOrderClass;
|
|
|
+use bizGhs\order\classes\OrderClass;
|
|
|
use common\components\delivery\helpers\HttpClient;
|
|
|
use common\components\delivery\platform\didi\Didi;
|
|
|
use Yii;
|
|
|
@@ -138,11 +141,16 @@ class DidiAdapter extends Didi implements Adapter
|
|
|
*/
|
|
|
public function processPriceResponse($resp)
|
|
|
{
|
|
|
- if (isset($resp['code']) && $resp['code'] == 0 && isset($resp['data'])) {
|
|
|
+ if (isset($resp['code']) && $resp['code'] == 200 && isset($resp['data'])) {
|
|
|
$data = $resp['data'];
|
|
|
$estimateList = $data['estimateList'] ?? [];
|
|
|
if (empty($estimateList)) {
|
|
|
- return null;
|
|
|
+ return [
|
|
|
+ 'code' => -1,
|
|
|
+ 'platform' => 'didi',
|
|
|
+ 'msg' => '没有预估结果列表',
|
|
|
+ 'data' => null
|
|
|
+ ];
|
|
|
}
|
|
|
|
|
|
// 选取第一个结果,或者根据策略选取(比如最便宜) TODO
|
|
|
@@ -151,6 +159,7 @@ class DidiAdapter extends Didi implements Adapter
|
|
|
|
|
|
return [
|
|
|
'platform' => 'didi',
|
|
|
+ 'estimateList' => $estimateList,
|
|
|
'estimate_id' => $estimate['estimateId'], // 预估ID,发单用
|
|
|
'total_distance' => $estimate['distance'] ?? 0,
|
|
|
'total_amount' => $estimate['fee'] ?? 0, // 分
|
|
|
@@ -161,7 +170,54 @@ class DidiAdapter extends Didi implements Adapter
|
|
|
'total_weight' => 0, // 响应里没返回重量
|
|
|
];
|
|
|
}
|
|
|
- return null;
|
|
|
+
|
|
|
+ return [
|
|
|
+ 'code' => $resp['code'] ?? -1,
|
|
|
+ 'platform' => 'didi',
|
|
|
+ 'msg' => $resp['msg'] ?? 'Unknown error',
|
|
|
+ 'data' => null
|
|
|
+ ];
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 转化订单数据
|
|
|
+ * @param $order
|
|
|
+ * @param $orderType
|
|
|
+ * @param $shop
|
|
|
+ * @param $params
|
|
|
+ * @return array
|
|
|
+ * @throws \Exception
|
|
|
+ */
|
|
|
+ public function formatOrderData($order, $orderType, $shop, $params)
|
|
|
+ {
|
|
|
+ $sender = [
|
|
|
+ 'fromSenderName' => $shop['merchantName'],
|
|
|
+ 'fromMobile' => $shop['mobile'],
|
|
|
+ 'fromAddress' => $shop['fullAddress'],
|
|
|
+ 'fromAddressDetail' => $shop['floor'],
|
|
|
+ 'fromLatitude' => (float)$shop['lat'],
|
|
|
+ 'fromLongitude' => (float)$shop['long'],
|
|
|
+ ];
|
|
|
+
|
|
|
+ $receiver = [
|
|
|
+ 'toReceiverName' => empty($order['showAddress']) ? $order['customName'] : $order['showAddress'],
|
|
|
+ 'toMobile' => Functions::getMobile($order),
|
|
|
+ 'toAddress' => $order['fullAddress'],
|
|
|
+ 'toAddressDetail' => $order['floor'],
|
|
|
+ 'toLatitude' => (float)$order['lat'],
|
|
|
+ 'toLongitude' => (float)$order['long'],
|
|
|
+ 'weight' => $order['weight'] ?? 1,
|
|
|
+ 'goodType' => $order['goodType'] ?? '8',
|
|
|
+ ];
|
|
|
+
|
|
|
+ $apiData = [
|
|
|
+ 'issOrderNo' => $order['orderSn'],
|
|
|
+ 'estimate_id' => $params['estimateId'] ?? null,
|
|
|
+ 'sender' => $sender,
|
|
|
+ 'receiverList' => [$receiver],
|
|
|
+ 'remark' => $params['remark'] ?? $order['remark'] ?? '',
|
|
|
+ ];
|
|
|
+ return $apiData;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -232,13 +288,15 @@ class DidiAdapter extends Didi implements Adapter
|
|
|
|
|
|
$resp = HttpClient::post($url, $payload);
|
|
|
|
|
|
- if (isset($resp['code']) && $resp['code'] == 0 && isset($resp['data'])) {
|
|
|
+ if (isset($resp['code']) && $resp['code'] == 200 && isset($resp['data'])) {
|
|
|
$respData = $resp['data'];
|
|
|
return [
|
|
|
'code' => 0,
|
|
|
'platform' => 'didi',
|
|
|
'data' => [
|
|
|
'orderId' => $respData['didiOrderNo'], // 滴滴订单号
|
|
|
+ 'distance' => 0,
|
|
|
+ 'fee' => 0,
|
|
|
// 可以附带其他信息
|
|
|
]
|
|
|
];
|
|
|
@@ -248,7 +306,6 @@ class DidiAdapter extends Didi implements Adapter
|
|
|
if (isset($resp['code']) && isset($resp['subCode'])) {
|
|
|
$msg .= " ({$resp['code']}-{$resp['subCode']})";
|
|
|
}
|
|
|
-
|
|
|
Yii::error('[DidiAdapter] createOrder failed: ' . json_encode($resp, JSON_UNESCAPED_UNICODE));
|
|
|
|
|
|
return [
|
|
|
@@ -305,42 +362,17 @@ class DidiAdapter extends Didi implements Adapter
|
|
|
|
|
|
/**
|
|
|
* 取消订单
|
|
|
+ *
|
|
|
+ * @param int $didiOrderNo 滴滴订单号
|
|
|
+ * @param int $post
|
|
|
*/
|
|
|
- public function cancelOrder($orderId)
|
|
|
+ public function cancelOrder($didiOrderNo, $post)
|
|
|
{
|
|
|
- // $orderId 应该是 outOrderNo (接入方订单号)
|
|
|
- // Didi API 需要 outOrderNo 和 didiOrderNo。
|
|
|
- // 如果我们只有 one of them,可能需要先查询?
|
|
|
- // 接口文档说: outOrderNo 是必须, didiOrderNo 是必须.
|
|
|
- // 这有点麻烦。通常 Adapter 的 input 只包含一个 ID。
|
|
|
- // 假设 $orderId 是 outOrderNo。
|
|
|
- // 此时我们可能没有 didiOrderNo,或者它需要作为第二个参数传入?
|
|
|
- // 参考 ShansongAdapter,它只传了一个 $orderId (issOrderNo).
|
|
|
- // 如果必须两个都传,可能需要修改调用方,或者我们只传 outOrderNo 试试,或者 look up mapping.
|
|
|
- // 文档: outOrderNo (String, 是), didiOrderNo (Long, 是).
|
|
|
- // 如果无法提供 didiOrderNo,可能无法取消。
|
|
|
- // 但通常业务系统会保存 didiOrderNo。
|
|
|
- // 这里假设调用方会在参数里传,或者 $orderId 是一个包含多个ID的数组?
|
|
|
- // 按照 ShansongAdapter: cancelOrder($orderId).
|
|
|
- // 只能假设 $orderId 结构可能包含 didiOrderNo,或者我们尝试只传 outOrderNo 看是否可行 (文档说是必须)。
|
|
|
- // 为了兼容性,如果 $orderId 是数组,则取值;如果是字符串,视为 outOrderNo,且 didiOrderNo 填 0 或空?
|
|
|
- // 让我们看看能不能只传 outOrderNo. "接口根据接入方订单号幂等...".
|
|
|
- // 还是严格按照文档吧。如果调用方没传 didiOrderNo,这步会失败。
|
|
|
-
|
|
|
- // 临时处理:检查 $orderId 是否是数组
|
|
|
- $didiOrderNo = 0;
|
|
|
- $outOrderNo = $orderId;
|
|
|
-
|
|
|
- if (is_array($orderId)) {
|
|
|
- $outOrderNo = $orderId['order_no'] ?? '';
|
|
|
- $didiOrderNo = $orderId['platform_order_no'] ?? 0;
|
|
|
- }
|
|
|
-
|
|
|
$businessParams = [
|
|
|
- 'outOrderNo' => (string)$outOrderNo,
|
|
|
+ 'outOrderNo' => (string)$post['outOrderNo'],
|
|
|
'didiOrderNo' => (int)$didiOrderNo,
|
|
|
- 'cancelSource' => 1, // 用户取消
|
|
|
- 'cancelReason' => '暂不需要',
|
|
|
+ 'cancelSource' => $post['cancelSource'],
|
|
|
+ //'cancelReason' => '暂不需要',
|
|
|
];
|
|
|
|
|
|
$payload = $this->buildRequestPayload($businessParams);
|
|
|
@@ -348,13 +380,14 @@ class DidiAdapter extends Didi implements Adapter
|
|
|
|
|
|
$resp = HttpClient::post($url, $payload);
|
|
|
|
|
|
- if (isset($resp['code']) && $resp['code'] == 0 && isset($resp['data'])) {
|
|
|
+ if (isset($resp['code']) && $resp['code'] == 200 && isset($resp['data'])) {
|
|
|
$data = $resp['data'];
|
|
|
return [
|
|
|
'code' => 0,
|
|
|
'platform' => 'didi',
|
|
|
'data' => [
|
|
|
- 'deductionFee' => $data['cancelFee'] ?? 0, // 分
|
|
|
+ 'deductionFee' => $data['cancelFee'], // 分
|
|
|
+ 'cancelFee' => $data['cancelFee'],
|
|
|
'cancelResult' => $data['cancelResult'],
|
|
|
]
|
|
|
];
|
|
|
@@ -367,4 +400,35 @@ class DidiAdapter extends Didi implements Adapter
|
|
|
'data' => null
|
|
|
];
|
|
|
}
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 查询订单详情
|
|
|
+ */
|
|
|
+ public function selectOrder($orderId, $thirdOrderNo = '')
|
|
|
+ {
|
|
|
+ $businessParams = [
|
|
|
+ 'didiOrderNo' => (int)$orderId,
|
|
|
+ 'outOrderNo' => (string)$thirdOrderNo,
|
|
|
+ ];
|
|
|
+
|
|
|
+ $payload = $this->buildRequestPayload($businessParams);
|
|
|
+ $url = $this->getApiUrl('freight.open.platform.channel.standard.orderInfo');
|
|
|
+
|
|
|
+ $resp = HttpClient::post($url, $payload);
|
|
|
+
|
|
|
+ if (isset($resp['code']) && $resp['code'] == 200 && isset($resp['data'])) {
|
|
|
+ return [
|
|
|
+ 'code' => 0,
|
|
|
+ 'platform' => 'didi',
|
|
|
+ 'data' => $resp['data']
|
|
|
+ ];
|
|
|
+ }
|
|
|
+
|
|
|
+ return [
|
|
|
+ 'code' => $resp['code'] ?? -1,
|
|
|
+ 'platform' => 'didi',
|
|
|
+ 'msg' => $resp['msg'] ?? 'Unknown error',
|
|
|
+ 'data' => null
|
|
|
+ ];
|
|
|
+ }
|
|
|
}
|