| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294 |
- <?php
- namespace common\components\delivery\platform\shansong;
- use biz\common\classes\GhsNotifyClass;
- use biz\common\classes\HdNotifyClass;
- use bizGhs\express\classes\GhsDeliveryOrderClass;
- use bizGhs\order\classes\OrderClass;
- use bizHd\express\classes\HdDeliveryOrderClass;
- use bizHd\order\classes\OrderClass as HdOrderClass;
- use bizHd\purchase\classes\PurchaseClass;
- use common\components\noticeUtil;
- use common\components\util;
- use Yii;
- /**
- * 闪送订单状态回调处理类
- * Class OrderStatusCallBack
- * @package common\components\delivery\platform\shanSong
- */
- class OrderStatusCallBack
- {
- /**
- * 处理闪送订单状态回调
- *
- * @param array $data 回调数据
- * @return bool 处理结果
- */
- public function handle($data)
- {
- try {
- // 记录回调原始数据
- //Yii::info('闪送订单状态回调 - 原始数据: ' . json_encode($data, JSON_UNESCAPED_UNICODE), 'shansong-callback');
-
- // 验证必要参数
- if (empty($data['issOrderNo']) || !isset($data['status'])) {
- Yii::error('闪送回调参数不完整: ' . json_encode($data, JSON_UNESCAPED_UNICODE), 'shansong-callback');
- return false;
- }
-
- // 将闪送平台的订单状态转换为系统内的 orderStatus
- $status = $data['status'];
- $subStatus = isset($data['subStatus']) ? $data['subStatus'] : null;
- $sendStatus = SendStatusUtil::convertOrderStatus($status, $subStatus);
- $orderStatus = OrderStatusUtil::convertStatus($status, $subStatus);
- // 查找配送订单
- $deliveryOrder = $this->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 '异常';
- }
- }
- }
|