|
|
@@ -81,138 +81,101 @@ class CallBackHandler
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 处理配送状态更改回调
|
|
|
- * 状态包括:10-配送员接单/改派;12-配送员到店;15-配送员配送中
|
|
|
+ * 通用订单回调处理逻辑
|
|
|
*
|
|
|
* @param array $data 回调数据
|
|
|
- * @return bool 处理结果
|
|
|
+ * @param string $logDesc 日志描述
|
|
|
+ * @param string $orderIdField 订单ID字段名
|
|
|
+ * @param callable|null $extraHandler 额外处理逻辑,参数为 ($order, $sendStatus, $isGhs)
|
|
|
+ * @return bool
|
|
|
*/
|
|
|
- private function handleRiderStatus($data)
|
|
|
+ private function processOrderCallback($data, $logDesc, $orderIdField = 'sf_order_id', $extraHandler = null)
|
|
|
{
|
|
|
- Yii::info('顺丰配送状态更改回调: ' . json_encode($data, JSON_UNESCAPED_UNICODE), 'shunfeng-callback');
|
|
|
-
|
|
|
- // 验证必要参数
|
|
|
- if (empty($data['sf_order_id']) || !isset($data['order_status'])) {
|
|
|
- Yii::error('顺丰配送状态回调参数不完整: ' . json_encode($data, JSON_UNESCAPED_UNICODE), 'shunfeng-callback');
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- $orderId = $data['sf_order_id'];
|
|
|
-
|
|
|
- // 查找配送订单
|
|
|
- $deliveryOrder = $this->getDeliveryOrder($orderId);
|
|
|
- if (!$deliveryOrder) {
|
|
|
- Yii::error('顺丰配送订单不存在: sf_order_id=' . $orderId, 'shunfeng-callback');
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- // 更新配送订单信息
|
|
|
- // $updateData = [];
|
|
|
- // 更新配送员信息
|
|
|
- // $updateData['riderName'] = $data['operator_name'];
|
|
|
- // $updateData['riderPhone'] = $data['operator_phone'];
|
|
|
- // $updateData['riderLng'] = $data['rider_lng'];
|
|
|
- // $updateData['riderLat'] = $data['rider_lat'];
|
|
|
- // $updateData['statusDesc'] = $data['status_desc'];
|
|
|
- // $updateData['pushTime'] = date('Y-m-d H:i:s', $data['push_time']);
|
|
|
-
|
|
|
- $orderStatus = $data['order_status'];
|
|
|
- // 转换顺丰订单状态到系统状态
|
|
|
- $sendStatus = $this->convertOrderSendStatus($orderStatus);
|
|
|
- $orderStatus = $this->convertOrderStatus($orderStatus);
|
|
|
-
|
|
|
- if ($sendStatus !== null) {
|
|
|
- // 更新配送订单
|
|
|
- $deliveryOrder->orderStatus = $sendStatus;
|
|
|
- $deliveryOrder->save();
|
|
|
-
|
|
|
- // 更新主订单的配送状态
|
|
|
- if(isset($deliveryOrder->ghsOrderId)){ // 批发
|
|
|
- util::checkRepeatCommit('ghs_'.$deliveryOrder->ghsOrderId.'_'.$sendStatus, 2);
|
|
|
-
|
|
|
- $order = OrderClass::getById($deliveryOrder->ghsOrderId, true);
|
|
|
- if ($order) {
|
|
|
- $order->sendStatus = $sendStatus;
|
|
|
- $order->status = $orderStatus;
|
|
|
- $order->save();
|
|
|
- }
|
|
|
- }elseif(isset($deliveryOrder->hdOrderId)){ // 零售
|
|
|
- util::checkRepeatCommit('hd_'.$deliveryOrder->hdOrderId.'_'.$sendStatus, 2);
|
|
|
+ Yii::info($logDesc . ': ' . json_encode($data, JSON_UNESCAPED_UNICODE), 'shunfeng-callback');
|
|
|
|
|
|
- $order = HdOrderClass::getById($deliveryOrder->hdOrderId, true);
|
|
|
- if ($order) {
|
|
|
- $order->sendStatus = $sendStatus;
|
|
|
- $order->status = $orderStatus;
|
|
|
- $order->save();
|
|
|
- }
|
|
|
- }
|
|
|
- } else {
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- return true;
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 处理订单完成回调
|
|
|
- * 订单状态:17-配送员点击完成
|
|
|
- *
|
|
|
- * @param array $data 回调数据
|
|
|
- * @return bool 处理结果
|
|
|
- */
|
|
|
- private function handleOrderComplete($data)
|
|
|
- {
|
|
|
- Yii::info('顺丰订单完成回调: ' . json_encode($data, JSON_UNESCAPED_UNICODE), 'shunfeng-callback');
|
|
|
-
|
|
|
- // 验证必要参数
|
|
|
- if (empty($data['sf_order_id'])) {
|
|
|
- Yii::error('顺丰订单完成回调参数不完整: ' . json_encode($data, JSON_UNESCAPED_UNICODE), 'shunfeng-callback');
|
|
|
+ if (empty($data[$orderIdField]) || !isset($data['order_status'])) {
|
|
|
+ Yii::error($logDesc . '参数不完整: ' . json_encode($data, JSON_UNESCAPED_UNICODE), 'shunfeng-callback');
|
|
|
return false;
|
|
|
}
|
|
|
+
|
|
|
+ $orderId = $data[$orderIdField];
|
|
|
|
|
|
- $orderId = $data['sf_order_id'];
|
|
|
// 查找配送订单
|
|
|
$deliveryOrder = $this->getDeliveryOrder($orderId);
|
|
|
if (!$deliveryOrder) {
|
|
|
- Yii::error('顺丰配送订单不存在: sf_order_id=' . $orderId, 'shunfeng-callback');
|
|
|
+ Yii::error('顺丰配送订单不存在: ' . $orderIdField . '=' . $orderId, 'shunfeng-callback');
|
|
|
return false;
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
$sendStatus = $this->convertOrderSendStatus($data['order_status']);
|
|
|
$orderStatus = $this->convertOrderStatus($data['order_status']);
|
|
|
+
|
|
|
if ($sendStatus === null) {
|
|
|
Yii::error('顺丰订单状态转换失败: ' . $data['order_status'], 'shunfeng-callback');
|
|
|
return false;
|
|
|
}
|
|
|
+
|
|
|
+ // 更新配送订单
|
|
|
$deliveryOrder->orderStatus = $sendStatus;
|
|
|
$deliveryOrder->save();
|
|
|
-
|
|
|
- // 更新主订单状态为已送达
|
|
|
- if(isset($deliveryOrder->ghsOrderId)){ // 批发
|
|
|
- util::checkRepeatCommit('ghs_'.$deliveryOrder->ghsOrderId.'_'.$sendStatus, 2);
|
|
|
- $order = OrderClass::getById($deliveryOrder->ghsOrderId, true, 'id,sendStatus,deliveryId,purchaseId,customId,status');
|
|
|
+
|
|
|
+ // 更新主订单
|
|
|
+ if (isset($deliveryOrder->ghsOrderId)) { // 批发
|
|
|
+ util::checkRepeatCommit('ghs_' . $deliveryOrder->ghsOrderId . '_' . $sendStatus, 2);
|
|
|
+ $order = OrderClass::getById($deliveryOrder->ghsOrderId, true);
|
|
|
if ($order) {
|
|
|
$order->sendStatus = $sendStatus;
|
|
|
$order->status = $orderStatus;
|
|
|
$order->save();
|
|
|
|
|
|
- // 确认送达,更新主订单状态
|
|
|
- if ($sendStatus == 5) {
|
|
|
- OrderClass::confirmReach($order, ['staffId' => 0, 'staffName' => '']);
|
|
|
+ if ($extraHandler) {
|
|
|
+ call_user_func($extraHandler, $order, $sendStatus, true);
|
|
|
}
|
|
|
}
|
|
|
- }elseif(isset($deliveryOrder->hdOrderId)){ // 零售
|
|
|
- util::checkRepeatCommit('hd_'.$deliveryOrder->hdOrderId.'_'.$sendStatus, 2);
|
|
|
+ } elseif (isset($deliveryOrder->hdOrderId)) { // 零售
|
|
|
+ util::checkRepeatCommit('hd_' . $deliveryOrder->hdOrderId . '_' . $sendStatus, 2);
|
|
|
$order = HdOrderClass::getById($deliveryOrder->hdOrderId, true);
|
|
|
if ($order) {
|
|
|
$order->sendStatus = $sendStatus;
|
|
|
$order->status = $orderStatus;
|
|
|
$order->save();
|
|
|
+
|
|
|
+ if ($extraHandler) {
|
|
|
+ call_user_func($extraHandler, $order, $sendStatus, false);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return true;
|
|
|
}
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 处理配送状态更改回调
|
|
|
+ * 状态包括:10-配送员接单/改派;12-配送员到店;15-配送员配送中
|
|
|
+ *
|
|
|
+ * @param array $data 回调数据
|
|
|
+ * @return bool 处理结果
|
|
|
+ */
|
|
|
+ private function handleRiderStatus($data)
|
|
|
+ {
|
|
|
+ return $this->processOrderCallback($data, '顺丰配送状态更改回调');
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 处理订单完成回调
|
|
|
+ * 订单状态:17-配送员点击完成
|
|
|
+ *
|
|
|
+ * @param array $data 回调数据
|
|
|
+ * @return bool 处理结果
|
|
|
+ */
|
|
|
+ private function handleOrderComplete($data)
|
|
|
+ {
|
|
|
+ return $this->processOrderCallback($data, '顺丰订单完成回调', 'sf_order_id', function($order, $sendStatus, $isGhs) {
|
|
|
+ if ($isGhs && $sendStatus == 5) {
|
|
|
+ OrderClass::confirmReach($order, ['staffId' => 0, 'staffName' => '']);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
|
|
|
/**
|
|
|
* 处理顺丰原因取消回调
|
|
|
@@ -223,56 +186,11 @@ class CallBackHandler
|
|
|
*/
|
|
|
private function handleSfCancel($data)
|
|
|
{
|
|
|
- Yii::info('顺丰取消订单回调: ' . json_encode($data, JSON_UNESCAPED_UNICODE), 'shunfeng-callback');
|
|
|
-
|
|
|
- // 验证必要参数
|
|
|
- if (empty($data['sf_order_id'])) {
|
|
|
- Yii::error('顺丰取消回调参数不完整: ' . json_encode($data, JSON_UNESCAPED_UNICODE), 'shunfeng-callback');
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- $orderId = $data['sf_order_id'];
|
|
|
- // 查找配送订单
|
|
|
- $deliveryOrder = $this->getDeliveryOrder($orderId);
|
|
|
- if (!$deliveryOrder) {
|
|
|
- Yii::error('顺丰配送订单不存在: sf_order_id=' . $orderId, 'shunfeng-callback');
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- $sendStatus = $this->convertOrderSendStatus($data['order_status']);
|
|
|
- $orderStatus = $this->convertOrderStatus($data['order_status']);
|
|
|
- if ($sendStatus === null) {
|
|
|
- Yii::error('顺丰订单状态转换失败: ' . $data['order_status'], 'shunfeng-callback');
|
|
|
- return false;
|
|
|
- }
|
|
|
- $deliveryOrder->orderStatus = $sendStatus;
|
|
|
- $deliveryOrder->save();
|
|
|
-
|
|
|
- // 更新主订单状态为取消
|
|
|
- if(isset($deliveryOrder->ghsOrderId)) { // 批发
|
|
|
- util::checkRepeatCommit('ghs_'.$deliveryOrder->ghsOrderId.'_'.$sendStatus, 2);
|
|
|
- $order = OrderClass::getById($deliveryOrder->ghsOrderId, true, 'id,sendStatus,deliveryId,purchaseId,customId,status');
|
|
|
- if($order) {
|
|
|
- $order->sendStatus = $sendStatus;
|
|
|
- $order->status = $orderStatus;
|
|
|
- $order->save();
|
|
|
-
|
|
|
- // 更新主订单状态为取消
|
|
|
- if($sendStatus == -1) {
|
|
|
- OrderClass::cancelOrderSend($order, ['staffId' => 0, 'staffName' => '']);
|
|
|
- }
|
|
|
+ return $this->processOrderCallback($data, '顺丰取消订单回调', 'sf_order_id', function($order, $sendStatus, $isGhs) {
|
|
|
+ if ($isGhs && $sendStatus == -1) {
|
|
|
+ OrderClass::cancelOrderSend($order, ['staffId' => 0, 'staffName' => '']);
|
|
|
}
|
|
|
- }elseif(isset($deliveryOrder->hdOrderId)){ // 零售
|
|
|
- util::checkRepeatCommit('hd_'.$deliveryOrder->hdOrderId.'_'.$sendStatus, 2);
|
|
|
- $order = HdOrderClass::getById($deliveryOrder->hdOrderId, true);
|
|
|
- if ($order) {
|
|
|
- $order->sendStatus = $sendStatus;
|
|
|
- $order->status = $orderStatus;
|
|
|
- $order->save();
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- return true;
|
|
|
+ });
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -284,56 +202,11 @@ class CallBackHandler
|
|
|
*/
|
|
|
private function handleRiderException($data)
|
|
|
{
|
|
|
- Yii::info('顺丰订单异常回调: ' . json_encode($data, JSON_UNESCAPED_UNICODE), 'shunfeng-callback');
|
|
|
-
|
|
|
- // 验证必要参数
|
|
|
- if (empty($data['sf_order_id'])) {
|
|
|
- Yii::error('顺丰异常回调参数不完整: ' . json_encode($data, JSON_UNESCAPED_UNICODE), 'shunfeng-callback');
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- $orderId = $data['sf_order_id'];
|
|
|
- // 查找配送订单
|
|
|
- $deliveryOrder = $this->getDeliveryOrder($orderId);
|
|
|
- if (!$deliveryOrder) {
|
|
|
- Yii::error('顺丰配送订单不存在: sf_order_id=' . $orderId, 'shunfeng-callback');
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- $sendStatus = $this->convertOrderSendStatus($data['order_status']);
|
|
|
- $orderStatus = $this->convertOrderStatus($data['order_status']);
|
|
|
- if ($sendStatus === null) {
|
|
|
- Yii::error('顺丰订单状态转换失败: ' . $data['order_status'], 'shunfeng-callback');
|
|
|
- return false;
|
|
|
- }
|
|
|
- $deliveryOrder->orderStatus = $sendStatus;
|
|
|
- $deliveryOrder->save();
|
|
|
-
|
|
|
- // 更新主订单状态为异常
|
|
|
- if(isset($deliveryOrder->ghsOrderId)) { // 批发
|
|
|
- util::checkRepeatCommit('ghs_'.$deliveryOrder->ghsOrderId.'_'.$sendStatus, 2);
|
|
|
- $order = OrderClass::getById($deliveryOrder->ghsOrderId, true, 'id,sendStatus,deliveryId,purchaseId,customId,status');
|
|
|
- if($order) {
|
|
|
- $order->sendStatus = $sendStatus;
|
|
|
- $order->status = $orderStatus;
|
|
|
- $order->save();
|
|
|
-
|
|
|
- // 更新主订单状态为异常
|
|
|
- if($sendStatus == -2) {
|
|
|
- OrderClass::cancelOrderSend($order, ['staffId' => 0, 'staffName' => '']);
|
|
|
- }
|
|
|
+ return $this->processOrderCallback($data, '顺丰订单异常回调', 'sf_order_id', function($order, $sendStatus, $isGhs) {
|
|
|
+ if ($isGhs && $sendStatus == -2) {
|
|
|
+ OrderClass::cancelOrderSend($order, ['staffId' => 0, 'staffName' => '']);
|
|
|
}
|
|
|
- }elseif(isset($deliveryOrder->hdOrderId)){ // 零售
|
|
|
- util::checkRepeatCommit('hd_'.$deliveryOrder->hdOrderId.'_'.$sendStatus, 2);
|
|
|
- $order = HdOrderClass::getById($deliveryOrder->hdOrderId, true);
|
|
|
- if ($order) {
|
|
|
- $order->sendStatus = $sendStatus;
|
|
|
- $order->status = $orderStatus;
|
|
|
- $order->save();
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- return true;
|
|
|
+ });
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -345,51 +218,7 @@ class CallBackHandler
|
|
|
*/
|
|
|
private function handleRiderRecall($data)
|
|
|
{
|
|
|
- Yii::info('顺丰骑士撤单回调: ' . json_encode($data, JSON_UNESCAPED_UNICODE), 'shunfeng-callback');
|
|
|
-
|
|
|
- // 验证必要参数
|
|
|
- if (empty($data['shop_order_id'])) {
|
|
|
- Yii::error('顺丰撤单回调参数不完整: ' . json_encode($data, JSON_UNESCAPED_UNICODE), 'shunfeng-callback');
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- $shopOrderId = $data['shop_order_id'];
|
|
|
- // 查找配送订单
|
|
|
- $deliveryOrder = $this->getDeliveryOrder($shopOrderId);
|
|
|
- if (!$deliveryOrder) {
|
|
|
- Yii::error('顺丰配送订单不存在: shop_order_id=' . $shopOrderId, 'shunfeng-callback');
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- $sendStatus = $this->convertOrderSendStatus($data['order_status']);
|
|
|
- $orderStatus = $this->convertOrderStatus($data['order_status']);
|
|
|
- if ($sendStatus === null) {
|
|
|
- Yii::error('顺丰订单状态转换失败: ' . $data['order_status'], 'shunfeng-callback');
|
|
|
- return false;
|
|
|
- }
|
|
|
- $deliveryOrder->orderStatus = $sendStatus;
|
|
|
- $deliveryOrder->save();
|
|
|
-
|
|
|
- // 更新主订单状态为派单中
|
|
|
- if(isset($deliveryOrder->ghsOrderId)) { // 批发
|
|
|
- util::checkRepeatCommit('ghs_'.$deliveryOrder->ghsOrderId.'_'.$sendStatus, 2);
|
|
|
- $order = OrderClass::getById($deliveryOrder->ghsOrderId, true);
|
|
|
- if($order) {
|
|
|
- $order->sendStatus = $sendStatus;
|
|
|
- $order->status = $orderStatus;
|
|
|
- $order->save();
|
|
|
- }
|
|
|
- }elseif(isset($deliveryOrder->hdOrderId)){ // 零售
|
|
|
- util::checkRepeatCommit('hd_'.$deliveryOrder->hdOrderId.'_'.$sendStatus, 2);
|
|
|
- $order = HdOrderClass::getById($deliveryOrder->hdOrderId, true);
|
|
|
- if ($order) {
|
|
|
- $order->sendStatus = $sendStatus;
|
|
|
- $order->status = $orderStatus;
|
|
|
- $order->save();
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- return true;
|
|
|
+ return $this->processOrderCallback($data, '顺丰骑士撤单回调', 'shop_order_id');
|
|
|
}
|
|
|
|
|
|
/**
|