| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179 |
- <?php
- namespace common\components\delivery\platform\fengniao;
- use bizGhs\express\classes\DeliveryAuthTokenClass;
- use bizGhs\express\classes\GhsDeliveryOrderClass;
- use bizGhs\order\classes\OrderClass;
- 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 = GhsDeliveryOrderClass::getByCondition(['deliveryId'=>'fengniao', 'orderId'=>$data['order_id']], true);
- // 将蜂鸟平台的订单状态转换为系统内的 orderStatus
- $sendStatus = OrderStatusUtil::convertOrderStatus($data['order_status']);
- $deliveryOrder->orderStatus = $sendStatus;
- $deliveryOrder->save();
- $order = OrderClass::getById($deliveryOrder->ghsOrderId, true, 'id,sendType,sendStatus,deliveryId,purchaseId,customId,status');
- $order->sendStatus = $sendStatus;
- $order->save();
- // 确认送达或取消订单,更新主订单状态
- if ($sendStatus == 5) {
- OrderClass::confirmReach($order, ['staffId' => 0, 'staffName' => '']);
- }
- if ($sendStatus == -1 || $sendStatus == -2) {
- OrderClass::cancelOrderSend($order, ['staffId' => 0, 'staffName' => '']);
- }
- 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;
- }
- }
|