| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- <?php
- namespace mall\controllers;
- use Yii;
- use bizMall\shop\classes\ShopClass;
- use common\components\delivery\services\DispatchService;
- use common\components\util;
- use yii\helpers\ArrayHelper;
- class DeliveryController extends BaseController
- {
- // 终端客户向花店买花材 -- 获取多个平台报价
- public function actionAllDeliveryQuotes()
- {
- $post = Yii::$app->request->post();
- $orderTime = date('Y-m-d H:i:s');
- // --------- $ghsShopId ----------
- $ghsShopId = $this->shopId;
- if (empty($ghsShopId)) {
- util::fail('店铺不存在');
- }
- $user = $this->user;
- if (empty($user)) {
- util::fail('用户不存在');
- }
- $mainId = $this->mainId;
- if (empty($mainId)) {
- util::fail('商户不存在');
- }
- $buyType = $post['buyType'] ?? 'huaCai'; //订单类型
- $order = $this->generateOrderData($buyType, $user, $post);
- $ghsShop = ShopClass::getById($ghsShopId);
- if (empty($ghsShop)) {
- util::fail('店铺信息不存在');
- }
-
- $ds = new DispatchService($mainId);
- $platformQuotes = $ds->getAllPlatformPrice($order, $ghsShop, $orderTime);
- if(isset($platformQuotes['error'])){
- util::fail($platformQuotes['error']);
- }
- // 格式化各平台报价为前端展示格式
- $deliveryList = $ds->formatPlatformQuotesForDisplay($platformQuotes);
- // 按 price 从低到高排序
- ArrayHelper::multisort($deliveryList, 'price', SORT_ASC);
- $ret['deliveryList'] = $deliveryList;
- util::success($ret, "success");
- }
- private function generateOrderData($buyType, $user, $post)
- {
- // 生成随机订单号,不要跟原来的混起来,跑腿-销售单-
- $prefix = 'PT-XSD-' . $this->mainId . '-';
- $orderSn = $prefix . round(microtime(true) * 1000);
- // 收货信息:优先结算页所选地址坐标,避免距离按登录用户资料计算
- $receive = $this->resolveReceiveInfo($user, $post);
- if (empty($receive['lat']) || empty($receive['long'])) {
- util::fail('请选择收货地址');
- }
- $baseOrder = array_merge($receive, [
- 'orderSn' => $orderSn,
- 'weight' => $post['weight'] ?? 1,
- 'remark' => $post['remark'] ?? '',
- 'prePrice' => floatval($post['totalPrice'] ?? 0),
- 'actPrice' => floatval($post['totalPrice'] ?? 0),
- ]);
- if ($buyType == 'huaCai') {
- return $baseOrder;
- }
- if ($buyType == 'huaShu') {
- return $baseOrder;
- }
- util::fail('不存在此订单类型');
- }
- /**
- * 解析收货地址与坐标:前端所选地址优先,其次登录用户资料
- * @param object|array $user 商城登录用户
- * @param array $post 报价请求参数(含 lat/long、receiveUserName 等)
- * @return array
- */
- private function resolveReceiveInfo($user, $post)
- {
- $userArr = is_object($user) ? $user->attributes : (array)$user;
- $region = isset($post['region']) && is_array($post['region']) ? $post['region'] : [];
- $lat = $post['lat'] ?? ($region['latitude'] ?? ($userArr['lat'] ?? ''));
- $long = $post['long'] ?? ($region['longitude'] ?? ($userArr['long'] ?? ''));
- $address = $post['address'] ?? ($userArr['address'] ?? '');
- $fullAddress = $post['fullAddress'] ?? ($address ?: ($userArr['fullAddress'] ?? ''));
- return [
- 'customName' => $post['receiveUserName'] ?? ($userArr['name'] ?? ''),
- 'customMobile' => $post['receiveMobile'] ?? ($userArr['mobile'] ?? ''),
- 'fullAddress' => $fullAddress,
- 'floor' => $post['floor'] ?? ($userArr['floor'] ?? ''),
- 'dist' => $post['dist'] ?? ($userArr['dist'] ?? ''),
- 'lat' => $lat,
- 'long' => $long,
- 'address' => $address,
- 'city' => $post['city'] ?? ($userArr['city'] ?? ''),
- ];
- }
- }
|