296 lines
8.4 KiB
TypeScript
296 lines
8.4 KiB
TypeScript
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();
|