diff --git a/backend/app/api/carmodoo.py b/backend/app/api/carmodoo.py index f171c01..2dc339e 100644 --- a/backend/app/api/carmodoo.py +++ b/backend/app/api/carmodoo.py @@ -170,6 +170,7 @@ class CarmodooClient: price_max: Optional[int] = None, fuel: Optional[str] = None, transmission: Optional[str] = None, + complex_code: Optional[str] = None, # 단지 코드 page: int = 1, page_size: int = 50 ) -> List[dict]: @@ -234,6 +235,8 @@ class CarmodooClient: } if transmission in trans_map: form_data['dGA'] = trans_map[transmission] + if complex_code: + form_data['c_danji'] = complex_code # 단지 코드 ajax_headers = { **self.headers, @@ -1009,6 +1012,36 @@ async def get_grades(maker_code: str, model_code: str): return grades +# 카모두 단지 목록 (자동차 매매단지) +CARMODOO_COMPLEXES = [ + {"code": "", "name": "전체"}, + {"code": "1", "name": "수원매매단지"}, + {"code": "2", "name": "판교매매단지"}, + {"code": "3", "name": "김포매매단지"}, + {"code": "4", "name": "부산매매단지"}, + {"code": "5", "name": "대구매매단지"}, + {"code": "6", "name": "광주매매단지"}, + {"code": "7", "name": "인천매매단지"}, + {"code": "8", "name": "대전매매단지"}, + {"code": "9", "name": "울산매매단지"}, + {"code": "10", "name": "창원매매단지"}, + {"code": "11", "name": "천안매매단지"}, + {"code": "12", "name": "청주매매단지"}, + {"code": "13", "name": "전주매매단지"}, +] + + +class CarmodooComplex(BaseModel): + code: str + name: str + + +@router.get("/complexes") +def get_complexes(): + """단지 목록 (자동차 매매단지)""" + return [CarmodooComplex(**c) for c in CARMODOO_COMPLEXES] + + class AdminSearchResultItem(BaseModel): id: str car_name: str @@ -1048,6 +1081,7 @@ class AdminSearchResponse(BaseModel): @router.get("/search", response_model=AdminSearchResponse) async def admin_carmodoo_search( + complex_code: Optional[str] = None, # 단지 코드 maker_code: Optional[str] = None, model_code: Optional[str] = None, car_type: Optional[str] = None, @@ -1084,6 +1118,7 @@ async def admin_carmodoo_search( price_min=price_min, price_max=price_max, fuel=fuel, + complex_code=complex_code, page=page, page_size=page_size ) diff --git a/frontend/src/app/admin/cars/page.tsx b/frontend/src/app/admin/cars/page.tsx index a0be49f..06d1d35 100644 --- a/frontend/src/app/admin/cars/page.tsx +++ b/frontend/src/app/admin/cars/page.tsx @@ -86,6 +86,7 @@ interface LocalCar { } interface SearchFilters { + complex_code: string; // 단지 코드 maker_code: string; model_code: string; grade: string; @@ -99,6 +100,11 @@ interface SearchFilters { displacement_max: string; } +interface CarmodooComplex { + code: string; + name: string; +} + const FUEL_TYPES = [ { value: '', label: 'All' }, { value: '가솔린', label: 'Gasoline' }, @@ -166,6 +172,7 @@ export default function CarsAdminPage() { const [totalCount, setTotalCount] = useState(0); const [currentPage, setCurrentPage] = useState(1); const [filters, setFilters] = useState({ + complex_code: '', maker_code: '', model_code: '', grade: '', @@ -178,6 +185,7 @@ export default function CarsAdminPage() { displacement_min: '', displacement_max: '', }); + const [complexes, setComplexes] = useState([]); const [importResult, setImportResult] = useState<{ imported: number; skipped: number; @@ -585,8 +593,12 @@ export default function CarsAdminPage() { const loadInitialData = async () => { try { - const makersRes = await api.get('/carmodoo/makers'); + const [makersRes, complexesRes] = await Promise.all([ + api.get('/carmodoo/makers'), + api.get('/carmodoo/complexes'), + ]); setMakers(makersRes.data); + setComplexes(complexesRes.data); } catch (err) { console.error('Failed to load initial data:', err); } @@ -623,6 +635,7 @@ export default function CarsAdminPage() { try { const params: Record = { page, page_size: 20 }; + if (filters.complex_code) params.complex_code = filters.complex_code; if (filters.maker_code) params.maker_code = filters.maker_code; if (filters.model_code) params.model_code = filters.model_code; if (filters.grade) params.grade = filters.grade; @@ -1953,8 +1966,26 @@ export default function CarsAdminPage() {

Search from Carmodoo

- {/* First Row: Maker, Model, Car Type, Grade */} + {/* First Row: Complex, Maker, Model, Grade */}
+ {/* Complex (단지선택) */} +
+ + +
+ {/* Maker (제조사) */}