getDeliveryOrder($data['issOrderNo']); if ($deliveryOrder === null) { if($status == 20 && $subStatus == 1){ Yii::info('闪送订单暂未创建 -- issOrderNo=' . $data['issOrderNo'], 'shansong-callback'); return true; } Yii::error('闪送订单不存在: issOrderNo=' . $data['issOrderNo'], 'shansong-callback'); return false; } // 处理骑手信息 $this->handleCourierInfo($data, $deliveryOrder); // 处理取消信息 $this->handleCancelInfo($data, $deliveryOrder); // 处理费用信息 $this->handleFeeInfo($data, $deliveryOrder); // 处理密码信息 $this->handlePasswordInfo($data, $deliveryOrder); // 更新配送订单状态 $deliveryOrder->orderStatus = $sendStatus; $deliveryOrder->save(); // 区分类别,然后更新主订单状态 if(isset($deliveryOrder->ghsOrderId)){ // 批发 $type = '批发'; util::checkRepeatCommit('ghs_pt_'.$deliveryOrder->ghsOrderId.'_'.$data['status'].'_'.$subStatus, 2);// 防止重复回调 $order = OrderClass::getById($deliveryOrder->ghsOrderId, true, 'id,sendType,sendStatus,deliveryId,purchaseId,customId,status'); $cg = PurchaseClass::getById($order->purchaseId, true, 'id,status,sendStatus'); if ($order) { // 确认送达或取消订单,更新主订单状态 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' => '']); $abortType = $data['abortType'] ?? null; $event = $this->cancelFrom($sendStatus, $abortType); GhsNotifyClass::ptErrorNotify($order->id, $event); } $cg->sendStatus = $sendStatus; $cg->save(); $order->sendStatus = $sendStatus; $order->save(); } }elseif(isset($deliveryOrder->hdOrderId)){ // 零售 $type = '零售'; util::checkRepeatCommit('hd_pt_'.$deliveryOrder->hdOrderId.'_'.$data['status'].'_'.$subStatus, 2);// 防止重复回调 $order = HdOrderClass::getById($deliveryOrder->hdOrderId, true, 'id,sendType,sendStatus,deliveryId,customId,status'); $order->status = $orderStatus; if ($order) { if (!in_array($order->sendStatus, [-1, -2]) && ($sendStatus == -1 || $sendStatus == -2)) { $abortType = $data['abortType'] ?? null; $event = $this->cancelFrom($sendStatus, $abortType); HdNotifyClass::ptErrorNotify($order->id, $event); } $order->sendStatus = $sendStatus; $order->save(); } } Yii::info("闪送({$type})订单状态更新成功: issOrderNo={$data['issOrderNo']}, status={$data['status']} , sendStatus={$sendStatus}", 'shansong-callback'); return true; } catch (\Exception $e) { Yii::error('闪送回调处理异常: ' . $e->getMessage() . ' | Trace: ' . $e->getTraceAsString(), 'shansong-callback'); return false; } } /** * 处理骑手信息 * * @param array $data 回调数据 * @param object $deliveryOrder 配送订单对象 */ private function handleCourierInfo($data, $deliveryOrder) { if (isset($data['courier']) && is_array($data['courier'])) { $courier = $data['courier']; Yii::info($data['issOrderNo'] . '-闪送骑手信息: ' . json_encode([ 'name' => $courier['name'] ?? '', 'mobile' => $courier['mobile'] ?? '', 'id' => $courier['id'] ?? '', 'headIcon' => $courier['headIcon'] ?? '', 'latitude' => $courier['latitude'] ?? '', 'longitude' => $courier['longitude'] ?? '', 'time' => $courier['time'] ?? '', 'orderCount' => $courier['orderCount'] ?? 0, 'estimateDeliveryTimeTip' => $courier['estimateDeliveryTimeTip'] ?? '', ], JSON_UNESCAPED_UNICODE), 'shansong-callback'); // 保存到数据库字段 // $deliveryOrder->courierName = $courier['name'] ?? ''; // $deliveryOrder->courierPhone = $courier['mobile'] ?? ''; // $deliveryOrder->courierId = $courier['id'] ?? ''; // $deliveryOrder->courierHeadIcon = $courier['headIcon'] ?? ''; // $deliveryOrder->courierLatitude = $courier['latitude'] ?? ''; // $deliveryOrder->courierLongitude = $courier['longitude'] ?? ''; // $deliveryOrder->courierTime = $courier['time'] ?? ''; // $deliveryOrder->estimateDeliveryTimeTip = $courier['estimateDeliveryTimeTip'] ?? ''; // 处理配送轨迹(如需要) if (isset($courier['deliveryProcessTrail']) && is_array($courier['deliveryProcessTrail'])) { Yii::info('闪送配送轨迹: ' . json_encode($courier['deliveryProcessTrail'], JSON_UNESCAPED_UNICODE), 'shansong-callback'); } } } /** * 处理取消信息 * * @param array $data 回调数据 * @param object $deliveryOrder 配送订单对象 */ private function handleCancelInfo($data, $deliveryOrder) { // 订单取消时(status=60)会返回取消相关信息 if (isset($data['status']) && $data['status'] == 60) { $abortType = $data['abortType'] ?? null; $punishType = $data['punishType'] ?? null; $abortReason = $data['abortReason'] ?? ''; Yii::info($data['issOrderNo'] . '-闪送取消信息: ' . json_encode([ 'abortType' => $abortType, 'abortTypeDesc' => $abortType ? SendStatusUtil::getAbortTypeDesc($abortType) : '', 'punishType' => $punishType, 'punishTypeDesc' => $punishType ? SendStatusUtil::getPunishTypeDesc($punishType) : '', 'abortReason' => $abortReason, ], JSON_UNESCAPED_UNICODE), 'shansong-callback'); // 保存到数据库字段 // $deliveryOrder->abortType = $abortType; // $deliveryOrder->punishType = $punishType; // $deliveryOrder->abortReason = $abortReason; } } /** * 处理费用信息 * * @param array $data 回调数据 * @param object $deliveryOrder 配送订单对象 */ private function handleFeeInfo($data, $deliveryOrder) { $deductAmount = $data['deductAmount'] ?? 0; $drawback = $data['drawback'] ?? 0; $sendBackFee = $data['sendBackFee'] ?? 0; // 记录费用信息(金额单位:分) if ($deductAmount > 0 || $drawback > 0 || $sendBackFee > 0) { Yii::info($data['issOrderNo'] . '-闪送费用信息: ' . json_encode([ 'deductAmount' => $deductAmount, // 扣款金额 'drawback' => $drawback, // 退款金额 'sendBackFee' => $sendBackFee, // 送回费 ], JSON_UNESCAPED_UNICODE), 'shansong-callback'); // 保存到数据库字段 | 扣款金额 + 送回费 $deliveryOrder->cancelCost = $deductAmount + $sendBackFee; } } /** * 处理密码信息 * * @param array $data 回调数据 * @param object $deliveryOrder 配送订单对象 */ private function handlePasswordInfo($data, $deliveryOrder) { $pickupPassword = $data['pickupPassword'] ?? ''; $deliveryPassword = $data['deliveryPassword'] ?? ''; if (!empty($pickupPassword) || !empty($deliveryPassword)) { Yii::info($data['issOrderNo'] . '-闪送密码信息: ' . json_encode([ 'pickupPassword' => $pickupPassword, 'deliveryPassword' => $deliveryPassword, ], JSON_UNESCAPED_UNICODE), 'shansong-callback'); // 保存到数据库字段 // $deliveryOrder->pickupPassword = $pickupPassword; // $deliveryOrder->deliveryPassword = $deliveryPassword; } } /** * 根据订单号查找配送订单 * * @param string $orderId * @return object|null */ private function getDeliveryOrder($orderId) { // 查找批发配送订单 $deliveryOrder = GhsDeliveryOrderClass::getByCondition([ 'deliveryId' => 'shansong', 'orderId' => $orderId ], true, 'id DESC'); if ($deliveryOrder) { return $deliveryOrder; } // 查找零售配送订单 return HdDeliveryOrderClass::getByCondition([ 'deliveryId' => 'shansong', 'orderId' => $orderId ], true, 'id DESC'); } private function cancelFrom($sendStatus, $abortType) { if($sendStatus == -1){ switch($abortType){ case 1: $which = '客户发起取消'; break; case 3: $which = '闪送员发起取消'; break; case 10: $which = '系统自动发起取消'; break; default: $which = '未知'; } return $which; } if($sendStatus == -2){ return '异常'; } } }