OrderStatusCallBack.php 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. <?php
  2. namespace common\components\delivery\platform\shansong;
  3. use bizGhs\express\classes\GhsDeliveryOrderClass;
  4. use bizGhs\order\classes\OrderClass;
  5. use Yii;
  6. /**
  7. * 闪送订单状态回调处理类
  8. * Class OrderStatusCallBack
  9. * @package common\components\delivery\platform\shanSong
  10. */
  11. class OrderStatusCallBack
  12. {
  13. /**
  14. * 处理闪送订单状态回调
  15. *
  16. * @param array $data 回调数据
  17. * @return bool 处理结果
  18. */
  19. public function handle($data)
  20. {
  21. try {
  22. // 记录回调原始数据
  23. Yii::info('闪送订单状态回调 - 原始数据: ' . json_encode($data, JSON_UNESCAPED_UNICODE), 'shansong-callback');
  24. // 验证必要参数
  25. if (empty($data['issOrderNo']) || !isset($data['status'])) {
  26. Yii::error('闪送回调参数不完整: ' . json_encode($data, JSON_UNESCAPED_UNICODE), 'shansong-callback');
  27. return false;
  28. }
  29. // 查找配送订单
  30. $deliveryOrder = GhsDeliveryOrderClass::getByCondition([
  31. 'deliveryId' => 'shansong',
  32. 'orderId' => $data['issOrderNo']
  33. ], true);
  34. if (!$deliveryOrder) {
  35. Yii::error('闪送订单不存在: issOrderNo=' . $data['issOrderNo'], 'shansong-callback');
  36. return false;
  37. }
  38. // 将闪送平台的订单状态转换为系统内的 orderStatus
  39. $subStatus = isset($data['subStatus']) ? $data['subStatus'] : null;
  40. $sendStatus = OrderStatusUtil::convertOrderStatus($data['status'], $subStatus);
  41. // 处理骑手信息
  42. $this->handleCourierInfo($data, $deliveryOrder);
  43. // 处理取消信息
  44. $this->handleCancelInfo($data, $deliveryOrder);
  45. // 处理费用信息
  46. $this->handleFeeInfo($data, $deliveryOrder);
  47. // 处理密码信息
  48. $this->handlePasswordInfo($data, $deliveryOrder);
  49. // 更新配送订单状态
  50. $deliveryOrder->orderStatus = $sendStatus;
  51. $deliveryOrder->save();
  52. // 更新主订单状态
  53. $order = OrderClass::getById($deliveryOrder->ghsOrderId, true, 'id,sendType,sendStatus,deliveryId,purchaseId,customId,status');
  54. if ($order) {
  55. $order->sendStatus = $sendStatus;
  56. $order->save();
  57. // 确认送达或取消订单,更新主订单状态
  58. if ($sendStatus == 5) {
  59. OrderClass::confirmReach($order, ['staffId' => 0, 'staffName' => '']);
  60. }
  61. if ($sendStatus == -1 || $sendStatus == -2) {
  62. OrderClass::cancelOrderSend($order, ['staffId' => 0, 'staffName' => '']);
  63. }
  64. }
  65. Yii::info('闪送订单状态更新成功: issOrderNo=' . $data['issOrderNo'] .
  66. ', status=' . $data['status'] .
  67. ', sendStatus=' . $sendStatus, 'shansong-callback');
  68. return true;
  69. } catch (\Exception $e) {
  70. Yii::error('闪送回调处理异常: ' . $e->getMessage() .
  71. ' | Trace: ' . $e->getTraceAsString(), 'shansong-callback');
  72. return false;
  73. }
  74. }
  75. /**
  76. * 处理骑手信息
  77. *
  78. * @param array $data 回调数据
  79. * @param object $deliveryOrder 配送订单对象
  80. */
  81. private function handleCourierInfo($data, $deliveryOrder)
  82. {
  83. if (isset($data['courier']) && is_array($data['courier'])) {
  84. $courier = $data['courier'];
  85. Yii::info($data['issOrderNo'] . '-闪送骑手信息: ' . json_encode([
  86. 'name' => $courier['name'] ?? '',
  87. 'mobile' => $courier['mobile'] ?? '',
  88. 'id' => $courier['id'] ?? '',
  89. 'headIcon' => $courier['headIcon'] ?? '',
  90. 'latitude' => $courier['latitude'] ?? '',
  91. 'longitude' => $courier['longitude'] ?? '',
  92. 'time' => $courier['time'] ?? '',
  93. 'orderCount' => $courier['orderCount'] ?? 0,
  94. 'estimateDeliveryTimeTip' => $courier['estimateDeliveryTimeTip'] ?? '',
  95. ], JSON_UNESCAPED_UNICODE), 'shansong-callback');
  96. // 保存到数据库字段
  97. // $deliveryOrder->courierName = $courier['name'] ?? '';
  98. // $deliveryOrder->courierPhone = $courier['mobile'] ?? '';
  99. // $deliveryOrder->courierId = $courier['id'] ?? '';
  100. // $deliveryOrder->courierHeadIcon = $courier['headIcon'] ?? '';
  101. // $deliveryOrder->courierLatitude = $courier['latitude'] ?? '';
  102. // $deliveryOrder->courierLongitude = $courier['longitude'] ?? '';
  103. // $deliveryOrder->courierTime = $courier['time'] ?? '';
  104. // $deliveryOrder->estimateDeliveryTimeTip = $courier['estimateDeliveryTimeTip'] ?? '';
  105. // 处理配送轨迹(如需要)
  106. if (isset($courier['deliveryProcessTrail']) && is_array($courier['deliveryProcessTrail'])) {
  107. Yii::info('闪送配送轨迹: ' . json_encode($courier['deliveryProcessTrail'], JSON_UNESCAPED_UNICODE), 'shansong-callback');
  108. // TODO: 如需要可以保存到单独的轨迹表或JSON字段
  109. }
  110. }
  111. }
  112. /**
  113. * 处理取消信息
  114. *
  115. * @param array $data 回调数据
  116. * @param object $deliveryOrder 配送订单对象
  117. */
  118. private function handleCancelInfo($data, $deliveryOrder)
  119. {
  120. // 订单取消时(status=60)会返回取消相关信息
  121. if (isset($data['status']) && $data['status'] == 60) {
  122. $abortType = $data['abortType'] ?? null;
  123. $punishType = $data['punishType'] ?? null;
  124. $abortReason = $data['abortReason'] ?? '';
  125. Yii::info($data['issOrderNo'] . '-闪送取消信息: ' . json_encode([
  126. 'abortType' => $abortType,
  127. 'abortTypeDesc' => $abortType ? OrderStatusUtil::getAbortTypeDesc($abortType) : '',
  128. 'punishType' => $punishType,
  129. 'punishTypeDesc' => $punishType ? OrderStatusUtil::getPunishTypeDesc($punishType) : '',
  130. 'abortReason' => $abortReason,
  131. ], JSON_UNESCAPED_UNICODE), 'shansong-callback');
  132. // TODO: 保存到数据库字段
  133. // $deliveryOrder->abortType = $abortType;
  134. // $deliveryOrder->punishType = $punishType;
  135. // $deliveryOrder->abortReason = $abortReason;
  136. }
  137. }
  138. /**
  139. * 处理费用信息
  140. *
  141. * @param array $data 回调数据
  142. * @param object $deliveryOrder 配送订单对象
  143. */
  144. private function handleFeeInfo($data, $deliveryOrder)
  145. {
  146. $deductAmount = $data['deductAmount'] ?? 0;
  147. $drawback = $data['drawback'] ?? 0;
  148. $sendBackFee = $data['sendBackFee'] ?? 0;
  149. // 记录费用信息(金额单位:分)
  150. if ($deductAmount > 0 || $drawback > 0 || $sendBackFee > 0) {
  151. Yii::info($data['issOrderNo'] . '-闪送费用信息: ' . json_encode([
  152. 'deductAmount' => $deductAmount, // 扣款金额
  153. 'drawback' => $drawback, // 退款金额
  154. 'sendBackFee' => $sendBackFee, // 送回费
  155. ], JSON_UNESCAPED_UNICODE), 'shansong-callback');
  156. // 保存到数据库字段 | 扣款金额 + 送回费
  157. $deliveryOrder->cancelCost = $deductAmount + $sendBackFee;
  158. }
  159. }
  160. /**
  161. * 处理密码信息
  162. *
  163. * @param array $data 回调数据
  164. * @param object $deliveryOrder 配送订单对象
  165. */
  166. private function handlePasswordInfo($data, $deliveryOrder)
  167. {
  168. $pickupPassword = $data['pickupPassword'] ?? '';
  169. $deliveryPassword = $data['deliveryPassword'] ?? '';
  170. if (!empty($pickupPassword) || !empty($deliveryPassword)) {
  171. Yii::info($data['issOrderNo'] . '-闪送密码信息: ' . json_encode([
  172. 'pickupPassword' => $pickupPassword,
  173. 'deliveryPassword' => $deliveryPassword,
  174. ], JSON_UNESCAPED_UNICODE), 'shansong-callback');
  175. // TODO: 保存到数据库字段
  176. // $deliveryOrder->pickupPassword = $pickupPassword;
  177. // $deliveryOrder->deliveryPassword = $deliveryPassword;
  178. }
  179. }
  180. }