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