getDeliveryOrder($data['order_id']); // 将蜂鸟平台的订单状态转换为系统内的 orderStatus $sendStatus = SendStatusUtil::convertOrderStatus($data['order_status']); $deliveryOrder->orderStatus = $sendStatus; $deliveryOrder->save(); $orderStatus = OrderStatusUtil::convertStatus($data['order_status']); if($sendStatus == -1){ noticeUtil::push('蜂鸟跑腿产生订单取消回调'); } if(isset($deliveryOrder->ghsOrderId)){ // 批发 util::checkRepeatCommit('ghs_pt_'.$deliveryOrder->ghsOrderId.'_'.$data['order_status'], 2); // 防止重复回调 $order = OrderClass::getById($deliveryOrder->ghsOrderId, true, 'id,sendType,sendStatus,deliveryId,purchaseId,customId,status'); $cg = PurchaseClass::getById($order->purchaseId, true, 'id,status,sendStatus'); // 确认送达或取消订单,更新主订单状态 if ($sendStatus == 5) { if($cg->status == 3){ OrderClass::confirmReach($order, ['staffId' => 0, 'staffName' => '']); }else{ Yii::warning('进行确认送达时,采购单状态不为3,无法进行确认送达。orderId='.$order->id); noticeUtil::push('进行确认送达时,采购单状态不为3,无法进行确认送达。orderId='.$order->id.', purchaseId='.$cg->id); } } if (!in_array($order->sendStatus, [-2, -1]) && ($sendStatus == -1 || $sendStatus == -2)) { OrderClass::cancelOrderSend($order, ['staffId' => 0, 'staffName' => '']); $event = $this->cancelFrom($sendStatus, $data); GhsNotifyClass::ptErrorNotify($order->id, $event); } $cg->sendStatus = $sendStatus; $cg->save(); $order->sendStatus = $sendStatus; $order->status = $orderStatus; $order->save(); }elseif(isset($deliveryOrder->hdOrderId)){ // 零售 util::checkRepeatCommit('hd_pt_'.$deliveryOrder->hdOrderId.'_'.$data['order_status'], 2); // 防止重复回调 $order = HdOrderClass::getById($deliveryOrder->hdOrderId, true, 'id,sendType,sendStatus,deliveryId,customId,status'); if (!in_array($order->sendStatus, [-2, -1]) && ($sendStatus == -1 || $sendStatus == -2)) { $event = $this->cancelFrom($sendStatus, $data); HdNotifyClass::ptErrorNotify($order->id, $event); } $order->sendStatus = $sendStatus; $order->status = $orderStatus; $order->save(); } return true; } /** * 处理异常报备回调 * @param array $data 回调数据 * @return bool 处理结果 */ private function handleAbnormalReportNotify($data) { Yii::info('蜂鸟异常报备回调: ' . json_encode($data, JSON_UNESCAPED_UNICODE), 'fengniao'); return $data; } /** * 处理商户出餐回调 * @param array $data 回调数据 * @return bool 处理结果 */ private function handleCookingFinishNotify($data) { Yii::info('蜂鸟商户出餐回调: ' . json_encode($data, JSON_UNESCAPED_UNICODE), 'fengniao'); return $data; } /** * 处理门店状态变更回调 * @param array $data 回调数据 * @return bool 处理结果 */ private function handleChainstoreStatusNotify($data) { Yii::info('蜂鸟门店状态变更回调: ' . json_encode($data, JSON_UNESCAPED_UNICODE), 'fengniao'); $statusMap = [ 10 => '上架审核中', 20 => '正常(已上架)', 30 => '上架审核失败', 40 => '已冻结', 50 => '已下架', ]; $modifyStatusMap = [ 0 => '无修改', 10 => '资料修改审核中', 20 => '审核通过', 30 => '审核驳回', ]; $merchantId = $data['merchant_id']; $chainStoreId = $data['chain_store_id']; $outShopCode = $data['out_shop_code']; $status = isset($data['status']) ? (int)$data['status'] : null; $modifyStatus = isset($data['modify_status']) ? (int)$data['modify_status'] : null; $remark = $data['remark'] ?? ''; $normalizedPayload = [ 'merchant_id' => $merchantId, 'chain_store_id' => $chainStoreId, 'out_shop_code' => $outShopCode, 'status' => [ 'code' => $status, 'desc' => $status !== null ? ($statusMap[$status] ?? '未知状态') : '', ], 'modify_status' => [ 'code' => $modifyStatus, 'desc' => $modifyStatus !== null ? ($modifyStatusMap[$modifyStatus] ?? '未知状态') : '', ], 'remark' => $remark, ]; $condition = ['mainId' => $outShopCode, 'platform' => 'fengniao']; $tokenModel = DeliveryAuthTokenClass::getByCondition($condition, true); if (!$tokenModel) { Yii::warning('蜂鸟门店状态回调未匹配到授权记录: ' . json_encode($condition, JSON_UNESCAPED_UNICODE), 'fengniao'); return false; } $tokenModel->callBack = json_encode($normalizedPayload, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); $tokenModel->merchantId = $merchantId; $tokenModel->shopId = $chainStoreId; if ($tokenModel->save() === false) { Yii::error('蜂鸟门店状态回调保存失败: ' . json_encode($tokenModel->getErrors(), JSON_UNESCAPED_UNICODE), 'fengniao'); return false; } return true; } /** * 处理门店采购服务变更回调 * @param array $data 回调数据 * @return bool 处理结果 */ private function handleChainstoreServiceStatusNotify($data) { Yii::info('蜂鸟门店采购服务变更回调: ' . json_encode($data, JSON_UNESCAPED_UNICODE), 'fengniao'); return $data; } /** * 处理门店营业时间变更回调 * @param array $data 回调数据 * @return bool 处理结果 */ private function handleChainstoreBusinessTimeNotify($data) { Yii::info('蜂鸟门店营业时间变更回调: ' . json_encode($data, JSON_UNESCAPED_UNICODE), 'fengniao'); return $data; } /** * 根据订单号查找配送订单 * * @param string $orderId * @return object|null */ private function getDeliveryOrder($orderId) { // 查找批发配送订单 $deliveryOrder = GhsDeliveryOrderClass::getByCondition([ 'deliveryId' => 'fengniao', 'orderId' => $orderId ], true); if ($deliveryOrder) { return $deliveryOrder; } // 查找零售配送订单 return HdDeliveryOrderClass::getByCondition([ 'deliveryId' => 'fengniao', 'orderId' => $orderId ], true); } private function cancelFrom($sendStatus, $data) { if($sendStatus == -1){ return $data['description'] ?? '取消'; } if($sendStatus == -2){ $errorScene =[ 'ORDER_INFORMATION_INCORRECT' => '商户推单信息有误,创建蜂鸟运单失败', 'OUT_OF_DELIVERY_SERVICE' => '超出配送服务能力,创建蜂鸟运单失败', 'MERCHANT_STORE_ERROR' => '因商户原因导致无法继续配送', 'CUSTOMER_ERROR' => '因用户原因导致无法继续配送', 'CARRIER_ERROR' => '因运力原因导致无法继续配送', 'ELE_SYSTEM_ERROR' => '蜂鸟系统异常', 'UNKNOW_ERROR' => '其他未知错误' ]; //return "异常code={$data['error_code']}, 异常描述:{$errorScene[$data['error_scene']]}"; return "{$data['detail_description']} -- {$data['description']}"; } } }