CallBackNotify.php 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. <?php
  2. namespace common\components\delivery\platform\fengniao;
  3. use bizGhs\express\classes\DeliveryAuthTokenClass;
  4. use bizGhs\express\classes\GhsDeliveryOrderClass;
  5. use bizGhs\order\classes\OrderClass;
  6. use Yii;
  7. //回调业务类型
  8. const TYPE_ORDER_STATUS_NOTIFY = 'orderStatusNotify'; //订单状态回调
  9. const TYPE_ABNORMAL_REPORT_NOTIFY = 'abnormalReportNotify'; //异常报备回调
  10. const TYPE_COOKING_FINISH_NOTIFY = 'cookingFinishNotify'; //商户出餐回调
  11. const TYPE_CHAINSTORE_STATUS_NOTIFY = 'chainstoreStatusNotify'; //门店状态变更回调
  12. const TYPE_CHAINSTORE_SERVICE_STATUS_NOTIFY = 'chainstoreServiceStatusNotify'; //门店采购服务变更回调
  13. const TYPE_CHAINSTORE_BUSINESS_TIME_NOTIFY = 'chainstoreBusinessTimeNotify'; //门店营业时间变更回调
  14. /**
  15. * Class OrderStatusNotify
  16. * @package common\components\delivery\platform\fengniao
  17. * 各回调业务类型处理
  18. */
  19. class CallBackNotify
  20. {
  21. public function handle($type, $data)
  22. {
  23. switch ($type) {
  24. case TYPE_ORDER_STATUS_NOTIFY:
  25. return self::handleOrderStatusNotify($data);
  26. case TYPE_ABNORMAL_REPORT_NOTIFY:
  27. return self::handleAbnormalReportNotify($data);
  28. case TYPE_COOKING_FINISH_NOTIFY:
  29. return self::handleCookingFinishNotify($data);
  30. case TYPE_CHAINSTORE_STATUS_NOTIFY:
  31. return self::handleChainstoreStatusNotify($data);
  32. case TYPE_CHAINSTORE_SERVICE_STATUS_NOTIFY:
  33. return self::handleChainstoreServiceStatusNotify($data);
  34. case TYPE_CHAINSTORE_BUSINESS_TIME_NOTIFY:
  35. return self::handleChainstoreBusinessTimeNotify($data);
  36. default:
  37. throw new \Exception('不支持的回调业务类型: ' . $type);
  38. }
  39. }
  40. /**
  41. * 处理订单状态回调
  42. * @param array $data 回调数据
  43. * @return bool 处理结果
  44. */
  45. private function handleOrderStatusNotify($data)
  46. {
  47. $deliveryOrder = GhsDeliveryOrderClass::getByCondition(['deliveryId'=>'fengniao', 'orderId'=>$data['order_id']], true);
  48. // 将蜂鸟平台的订单状态转换为系统内的 orderStatus
  49. $sendStatus = OrderStatusUtil::convertOrderStatus($data['order_status']);
  50. $deliveryOrder->orderStatus = $sendStatus;
  51. $deliveryOrder->save();
  52. $order = OrderClass::getById($deliveryOrder->ghsOrderId, true, 'id,sendType,sendStatus,deliveryId,purchaseId,customId,status');
  53. $order->sendStatus = $sendStatus;
  54. $order->save();
  55. // 确认送达或取消订单,更新主订单状态
  56. if ($sendStatus == 5) {
  57. OrderClass::confirmReach($order, ['staffId' => 0, 'staffName' => '']);
  58. }
  59. if ($sendStatus == -1 || $sendStatus == -2) {
  60. OrderClass::cancelOrderSend($order, ['staffId' => 0, 'staffName' => '']);
  61. }
  62. return true;
  63. }
  64. /**
  65. * 处理异常报备回调
  66. * @param array $data 回调数据
  67. * @return bool 处理结果
  68. */
  69. private function handleAbnormalReportNotify($data)
  70. {
  71. Yii::info('蜂鸟异常报备回调: ' . json_encode($data, JSON_UNESCAPED_UNICODE), 'fengniao');
  72. return $data;
  73. }
  74. /**
  75. * 处理商户出餐回调
  76. * @param array $data 回调数据
  77. * @return bool 处理结果
  78. */
  79. private function handleCookingFinishNotify($data)
  80. {
  81. Yii::info('蜂鸟商户出餐回调: ' . json_encode($data, JSON_UNESCAPED_UNICODE), 'fengniao');
  82. return $data;
  83. }
  84. /**
  85. * 处理门店状态变更回调
  86. * @param array $data 回调数据
  87. * @return bool 处理结果
  88. */
  89. private function handleChainstoreStatusNotify($data)
  90. {
  91. Yii::info('蜂鸟门店状态变更回调: ' . json_encode($data, JSON_UNESCAPED_UNICODE), 'fengniao');
  92. $statusMap = [
  93. 10 => '上架审核中',
  94. 20 => '正常(已上架)',
  95. 30 => '上架审核失败',
  96. 40 => '已冻结',
  97. 50 => '已下架',
  98. ];
  99. $modifyStatusMap = [
  100. 0 => '无修改',
  101. 10 => '资料修改审核中',
  102. 20 => '审核通过',
  103. 30 => '审核驳回',
  104. ];
  105. $merchantId = $data['merchant_id'];
  106. $chainStoreId = $data['chain_store_id'];
  107. $outShopCode = $data['out_shop_code'];
  108. $status = isset($data['status']) ? (int)$data['status'] : null;
  109. $modifyStatus = isset($data['modify_status']) ? (int)$data['modify_status'] : null;
  110. $remark = $data['remark'] ?? '';
  111. $normalizedPayload = [
  112. 'merchant_id' => $merchantId,
  113. 'chain_store_id' => $chainStoreId,
  114. 'out_shop_code' => $outShopCode,
  115. 'status' => [
  116. 'code' => $status,
  117. 'desc' => $status !== null ? ($statusMap[$status] ?? '未知状态') : '',
  118. ],
  119. 'modify_status' => [
  120. 'code' => $modifyStatus,
  121. 'desc' => $modifyStatus !== null ? ($modifyStatusMap[$modifyStatus] ?? '未知状态') : '',
  122. ],
  123. 'remark' => $remark,
  124. ];
  125. $condition = ['mainId' => $outShopCode, 'platform' => 'fengniao'];
  126. $tokenModel = DeliveryAuthTokenClass::getByCondition($condition, true);
  127. if (!$tokenModel) {
  128. Yii::warning('蜂鸟门店状态回调未匹配到授权记录: ' . json_encode($condition, JSON_UNESCAPED_UNICODE), 'fengniao');
  129. return false;
  130. }
  131. $tokenModel->callBack = json_encode($normalizedPayload, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
  132. $tokenModel->merchantId = $merchantId;
  133. $tokenModel->shopId = $chainStoreId;
  134. if ($tokenModel->save() === false) {
  135. Yii::error('蜂鸟门店状态回调保存失败: ' . json_encode($tokenModel->getErrors(), JSON_UNESCAPED_UNICODE), 'fengniao');
  136. return false;
  137. }
  138. return true;
  139. }
  140. /**
  141. * 处理门店采购服务变更回调
  142. * @param array $data 回调数据
  143. * @return bool 处理结果
  144. */
  145. private function handleChainstoreServiceStatusNotify($data)
  146. {
  147. Yii::info('蜂鸟门店采购服务变更回调: ' . json_encode($data, JSON_UNESCAPED_UNICODE), 'fengniao');
  148. return $data;
  149. }
  150. /**
  151. * 处理门店营业时间变更回调
  152. * @param array $data 回调数据
  153. * @return bool 处理结果
  154. */
  155. private function handleChainstoreBusinessTimeNotify($data)
  156. {
  157. Yii::info('蜂鸟门店营业时间变更回调: ' . json_encode($data, JSON_UNESCAPED_UNICODE), 'fengniao');
  158. return $data;
  159. }
  160. }