DeliveryController.php 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. <?php
  2. namespace mall\controllers;
  3. use Yii;
  4. use bizMall\shop\classes\ShopClass;
  5. use common\components\delivery\services\DispatchService;
  6. use common\components\util;
  7. use yii\helpers\ArrayHelper;
  8. class DeliveryController extends BaseController
  9. {
  10. // 终端客户向花店买花材 -- 获取多个平台报价
  11. public function actionAllDeliveryQuotes()
  12. {
  13. $post = Yii::$app->request->post();
  14. $orderTime = date('Y-m-d H:i:s');
  15. // --------- $ghsShopId ----------
  16. $ghsShopId = $this->shopId;
  17. if (empty($ghsShopId)) {
  18. util::fail('店铺不存在');
  19. }
  20. $user = $this->user;
  21. if (empty($user)) {
  22. util::fail('用户不存在');
  23. }
  24. $mainId = $this->mainId;
  25. if (empty($mainId)) {
  26. util::fail('商户不存在');
  27. }
  28. $buyType = $post['buyType'] ?? 'huaCai'; //订单类型
  29. $order = $this->generateOrderData($buyType, $user, $post);
  30. $ghsShop = ShopClass::getById($ghsShopId);
  31. if (empty($ghsShop)) {
  32. util::fail('店铺信息不存在');
  33. }
  34. $ds = new DispatchService($mainId);
  35. $platformQuotes = $ds->getAllPlatformPrice($order, $ghsShop, $orderTime);
  36. if(isset($platformQuotes['error'])){
  37. util::fail($platformQuotes['error']);
  38. }
  39. // 格式化各平台报价为前端展示格式
  40. $deliveryList = $ds->formatPlatformQuotesForDisplay($platformQuotes);
  41. // 按 price 从低到高排序
  42. ArrayHelper::multisort($deliveryList, 'price', SORT_ASC);
  43. $ret['deliveryList'] = $deliveryList;
  44. util::success($ret, "success");
  45. }
  46. private function generateOrderData($buyType, $user, $post)
  47. {
  48. // 生成随机订单号,不要跟原来的混起来,跑腿-销售单-
  49. $prefix = 'PT-XSD-' . $this->mainId . '-';
  50. $orderSn = $prefix . round(microtime(true) * 1000);
  51. // 收货信息:优先结算页所选地址坐标,避免距离按登录用户资料计算
  52. $receive = $this->resolveReceiveInfo($user, $post);
  53. if (empty($receive['lat']) || empty($receive['long'])) {
  54. util::fail('请选择收货地址');
  55. }
  56. $baseOrder = array_merge($receive, [
  57. 'orderSn' => $orderSn,
  58. 'weight' => $post['weight'] ?? 1,
  59. 'remark' => $post['remark'] ?? '',
  60. 'prePrice' => floatval($post['totalPrice'] ?? 0),
  61. 'actPrice' => floatval($post['totalPrice'] ?? 0),
  62. ]);
  63. if ($buyType == 'huaCai') {
  64. return $baseOrder;
  65. }
  66. if ($buyType == 'huaShu') {
  67. return $baseOrder;
  68. }
  69. util::fail('不存在此订单类型');
  70. }
  71. /**
  72. * 解析收货地址与坐标:前端所选地址优先,其次登录用户资料
  73. * @param object|array $user 商城登录用户
  74. * @param array $post 报价请求参数(含 lat/long、receiveUserName 等)
  75. * @return array
  76. */
  77. private function resolveReceiveInfo($user, $post)
  78. {
  79. $userArr = is_object($user) ? $user->attributes : (array)$user;
  80. $region = isset($post['region']) && is_array($post['region']) ? $post['region'] : [];
  81. $lat = $post['lat'] ?? ($region['latitude'] ?? ($userArr['lat'] ?? ''));
  82. $long = $post['long'] ?? ($region['longitude'] ?? ($userArr['long'] ?? ''));
  83. $address = $post['address'] ?? ($userArr['address'] ?? '');
  84. $fullAddress = $post['fullAddress'] ?? ($address ?: ($userArr['fullAddress'] ?? ''));
  85. return [
  86. 'customName' => $post['receiveUserName'] ?? ($userArr['name'] ?? ''),
  87. 'customMobile' => $post['receiveMobile'] ?? ($userArr['mobile'] ?? ''),
  88. 'fullAddress' => $fullAddress,
  89. 'floor' => $post['floor'] ?? ($userArr['floor'] ?? ''),
  90. 'dist' => $post['dist'] ?? ($userArr['dist'] ?? ''),
  91. 'lat' => $lat,
  92. 'long' => $long,
  93. 'address' => $address,
  94. 'city' => $post['city'] ?? ($userArr['city'] ?? ''),
  95. ];
  96. }
  97. }