$code, 'del' => 0]) ->field('id,city_id') ->findOrEmpty(); if ($user->isEmpty()) { return self::getHeadquartersCity(); } $cityId = self::resolveUserCityId((int)$user['id'], (int)$user['city_id']); if ($cityId <= 0) { return self::getHeadquartersCity(); } return self::formatCityInfo($cityId); } /** * 根据用户ID获取所属城市(分销扫码等场景) */ public static function getCityByUserId(int $userId): array { $user = User::where(['id' => $userId, 'del' => 0]) ->field('id,city_id') ->findOrEmpty(); if ($user->isEmpty()) { return self::getHeadquartersCity(); } $cityId = self::resolveUserCityId((int)$user['id'], (int)$user['city_id']); if ($cityId <= 0) { return self::getHeadquartersCity(); } return self::formatCityInfo($cityId); } /** * 解析用户所属城市:优先用户表,其次分销申请地区 */ protected static function resolveUserCityId(int $userId, int $cityId = 0): int { if ($cityId > 0) { return $cityId; } if ($userId <= 0) { return 0; } return (int)DistributionMemberApply::where([ ['user_id', '=', $userId], ['status', '=', 1], ])->order('id desc')->value('city'); } /** * 获取用户所属城市ID,扫码绑定时继承上级地区 */ public static function getUserCityId(int $userId): int { if ($userId <= 0) { return 0; } $cityId = (int)User::where(['id' => $userId, 'del' => 0])->value('city_id'); return self::resolveUserCityId($userId, $cityId); } protected static function formatCityInfo(int $cityId, bool $isHeadquarters = false): array { if ($cityId <= 0) { return [ 'id' => 0, 'name' => '上海总部', 'gcj02_lat' => 0, 'gcj02_lng' => 0, 'shop_id' => 1, 'is_headquarters' => 1, ]; } $city = DevRegion::where('id', $cityId) ->field('id,name,gcj02_lat,gcj02_lng,db09_lat,db09_lng') ->findOrEmpty(); if ($city->isEmpty()) { return [ 'id' => 0, 'name' => '上海总部', 'gcj02_lat' => 0, 'gcj02_lng' => 0, 'shop_id' => 1, 'is_headquarters' => 1, ]; } $shop = Shop::where([ ['city_id', '=', $cityId], ['is_run', '=', 1], ['is_freeze', '=', 0], ['del', '=', 0], ])->field('id')->findOrEmpty(); return [ 'id' => (int)$city['id'], 'name' => $city['name'], 'gcj02_lat' => (float)($city['gcj02_lat'] ?: 0), 'gcj02_lng' => (float)($city['gcj02_lng'] ?: 0), 'shop_id' => $shop->isEmpty() ? 1 : (int)$shop['id'], 'is_headquarters' => $isHeadquarters ? 1 : 0, ]; } protected static function resolveHeadquartersCityId(): int { $cityId = (int)ConfigServer::get('shop', 'headquarters_city_id', 0); if ($cityId <= 0) { $cityId = (int)Shop::where(['id' => 1, 'del' => 0])->value('city_id'); } if ($cityId <= 0) { $cityId = (int)DevRegion::where(['level' => 2]) ->whereLike('name', '上海%') ->value('id'); } return $cityId; } }