import { Request, Response } from "express"; import YardLayoutService from "../services/YardLayoutService"; export class YardLayoutController { // 모든 야드 레이아웃 목록 조회 async getAllLayouts(req: Request, res: Response) { try { const layouts = await YardLayoutService.getAllLayouts(); res.json({ success: true, data: layouts }); } catch (error: any) { console.error("Error fetching yard layouts:", error); res.status(500).json({ success: false, message: "야드 레이아웃 목록 조회 중 오류가 발생했습니다.", error: error.message, }); } } // 특정 야드 레이아웃 상세 조회 async getLayoutById(req: Request, res: Response) { try { const { id } = req.params; const layout = await YardLayoutService.getLayoutById(parseInt(id)); if (!layout) { return res.status(404).json({ success: false, message: "야드 레이아웃을 찾을 수 없습니다.", }); } return res.json({ success: true, data: layout }); } catch (error: any) { console.error("Error fetching yard layout:", error); return res.status(500).json({ success: false, message: "야드 레이아웃 조회 중 오류가 발생했습니다.", error: error.message, }); } } // 새 야드 레이아웃 생성 async createLayout(req: Request, res: Response) { try { const { name, description } = req.body; if (!name) { return res.status(400).json({ success: false, message: "야드 이름은 필수입니다.", }); } const created_by = (req as any).user?.userId || "system"; const layout = await YardLayoutService.createLayout({ name, description, created_by, }); return res.status(201).json({ success: true, data: layout }); } catch (error: any) { console.error("Error creating yard layout:", error); return res.status(500).json({ success: false, message: "야드 레이아웃 생성 중 오류가 발생했습니다.", error: error.message, }); } } // 야드 레이아웃 수정 async updateLayout(req: Request, res: Response) { try { const { id } = req.params; const { name, description } = req.body; const layout = await YardLayoutService.updateLayout(parseInt(id), { name, description, }); if (!layout) { return res.status(404).json({ success: false, message: "야드 레이아웃을 찾을 수 없습니다.", }); } return res.json({ success: true, data: layout }); } catch (error: any) { console.error("Error updating yard layout:", error); return res.status(500).json({ success: false, message: "야드 레이아웃 수정 중 오류가 발생했습니다.", error: error.message, }); } } // 야드 레이아웃 삭제 async deleteLayout(req: Request, res: Response) { try { const { id } = req.params; const layout = await YardLayoutService.deleteLayout(parseInt(id)); if (!layout) { return res.status(404).json({ success: false, message: "야드 레이아웃을 찾을 수 없습니다.", }); } return res.json({ success: true, message: "야드 레이아웃이 삭제되었습니다.", }); } catch (error: any) { console.error("Error deleting yard layout:", error); return res.status(500).json({ success: false, message: "야드 레이아웃 삭제 중 오류가 발생했습니다.", error: error.message, }); } } // 특정 야드의 모든 배치 자재 조회 async getPlacementsByLayoutId(req: Request, res: Response) { try { const { id } = req.params; const placements = await YardLayoutService.getPlacementsByLayoutId( parseInt(id) ); res.json({ success: true, data: placements }); } catch (error: any) { console.error("Error fetching placements:", error); res.status(500).json({ success: false, message: "배치 자재 조회 중 오류가 발생했습니다.", error: error.message, }); } } // 야드에 자재 배치 추가 (빈 요소 또는 설정된 요소) async addMaterialPlacement(req: Request, res: Response) { try { const { id } = req.params; const placementData = req.body; // 데이터 바인딩 재설계 후 material_code와 external_material_id는 선택사항 // 빈 요소를 추가할 수 있어야 함 const placement = await YardLayoutService.addMaterialPlacement( parseInt(id), placementData ); return res.status(201).json({ success: true, data: placement }); } catch (error: any) { console.error("Error adding material placement:", error); if (error.code === "23505") { // 유니크 제약 조건 위반 return res.status(409).json({ success: false, message: "이미 배치된 자재입니다.", }); } return res.status(500).json({ success: false, message: "자재 배치 추가 중 오류가 발생했습니다.", error: error.message, }); } } // 배치 정보 수정 async updatePlacement(req: Request, res: Response) { try { const { id } = req.params; const placementData = req.body; const placement = await YardLayoutService.updatePlacement( parseInt(id), placementData ); if (!placement) { return res.status(404).json({ success: false, message: "배치 정보를 찾을 수 없습니다.", }); } return res.json({ success: true, data: placement }); } catch (error: any) { console.error("Error updating placement:", error); return res.status(500).json({ success: false, message: "배치 정보 수정 중 오류가 발생했습니다.", error: error.message, }); } } // 배치 해제 async removePlacement(req: Request, res: Response) { try { const { id } = req.params; const placement = await YardLayoutService.removePlacement(parseInt(id)); if (!placement) { return res.status(404).json({ success: false, message: "배치 정보를 찾을 수 없습니다.", }); } return res.json({ success: true, message: "배치가 해제되었습니다." }); } catch (error: any) { console.error("Error removing placement:", error); return res.status(500).json({ success: false, message: "배치 해제 중 오류가 발생했습니다.", error: error.message, }); } } // 여러 배치 일괄 업데이트 async batchUpdatePlacements(req: Request, res: Response) { try { const { id } = req.params; const { placements } = req.body; if (!Array.isArray(placements) || placements.length === 0) { return res.status(400).json({ success: false, message: "배치 목록이 필요합니다.", }); } const updatedPlacements = await YardLayoutService.batchUpdatePlacements( parseInt(id), placements ); return res.json({ success: true, data: updatedPlacements }); } catch (error: any) { console.error("Error batch updating placements:", error); return res.status(500).json({ success: false, message: "배치 일괄 업데이트 중 오류가 발생했습니다.", error: error.message, }); } } // 야드 레이아웃 복제 async duplicateLayout(req: Request, res: Response) { try { const { id } = req.params; const { name } = req.body; if (!name) { return res.status(400).json({ success: false, message: "새 야드 이름은 필수입니다.", }); } const layout = await YardLayoutService.duplicateLayout( parseInt(id), name ); return res.status(201).json({ success: true, data: layout }); } catch (error: any) { console.error("Error duplicating yard layout:", error); return res.status(500).json({ success: false, message: "야드 레이아웃 복제 중 오류가 발생했습니다.", error: error.message, }); } } } export default new YardLayoutController();