| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266 |
- <?php
- namespace common\components\delivery\platform\fengniao;
- use biz\common\classes\GhsNotifyClass;
- use biz\common\classes\HdNotifyClass;
- use bizGhs\express\classes\DeliveryAuthTokenClass;
- 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;
- //回调业务类型
- const TYPE_ORDER_STATUS_NOTIFY = 'orderStatusNotify'; //订单状态回调
- const TYPE_ABNORMAL_REPORT_NOTIFY = 'abnormalReportNotify'; //异常报备回调
- const TYPE_COOKING_FINISH_NOTIFY = 'cookingFinishNotify'; //商户出餐回调
- const TYPE_CHAINSTORE_STATUS_NOTIFY = 'chainstoreStatusNotify'; //门店状态变更回调
- const TYPE_CHAINSTORE_SERVICE_STATUS_NOTIFY = 'chainstoreServiceStatusNotify'; //门店采购服务变更回调
- const TYPE_CHAINSTORE_BUSINESS_TIME_NOTIFY = 'chainstoreBusinessTimeNotify'; //门店营业时间变更回调
- /**
- * Class OrderStatusNotify
- * @package common\components\delivery\platform\fengniao
- * 各回调业务类型处理
- */
- class CallBackNotify
- {
- public function handle($type, $data)
- {
- switch ($type) {
- case TYPE_ORDER_STATUS_NOTIFY:
- return self::handleOrderStatusNotify($data);
- case TYPE_ABNORMAL_REPORT_NOTIFY:
- return self::handleAbnormalReportNotify($data);
- case TYPE_COOKING_FINISH_NOTIFY:
- return self::handleCookingFinishNotify($data);
- case TYPE_CHAINSTORE_STATUS_NOTIFY:
- return self::handleChainstoreStatusNotify($data);
- case TYPE_CHAINSTORE_SERVICE_STATUS_NOTIFY:
- return self::handleChainstoreServiceStatusNotify($data);
- case TYPE_CHAINSTORE_BUSINESS_TIME_NOTIFY:
- return self::handleChainstoreBusinessTimeNotify($data);
- default:
- throw new \Exception('不支持的回调业务类型: ' . $type);
- }
- }
- /**
- * 处理订单状态回调
- * @param array $data 回调数据
- * @return bool 处理结果
- */
- private function handleOrderStatusNotify($data)
- {
- $deliveryOrder = $this->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']}";
- }
- }
- }
|