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'] ?? ''), ]; } }