## 주요 기능 - 설비 등록/수정/삭제 기능 - 작업장별 설비 연결 - 작업장 지도에서 설비 위치 정의 - 필터링 및 검색 기능 ## 백엔드 - equipments 테이블 생성 (마이그레이션) - 설비 API (모델, 컨트롤러, 라우트) 구현 - workplaces 테이블에 layout_image 컬럼 추가 ## 프론트엔드 - 설비 관리 페이지 (equipments.html) - 설비 관리 JavaScript (equipment-management.js) - 작업장 지도 모달 개선 ## 버그 수정 - 카테고리/작업장 이미지 보존 로직 개선 (null 처리) - 작업장 레이아웃 이미지 업로드 경로 수정 (public/uploads → uploads) 🤖 Generated with Claude Code Co-Authored-By: Claude <noreply@anthropic.com>
350 lines
10 KiB
JavaScript
350 lines
10 KiB
JavaScript
// controllers/equipmentController.js
|
|
const EquipmentModel = require('../models/equipmentModel');
|
|
|
|
const EquipmentController = {
|
|
// CREATE - 설비 생성
|
|
createEquipment: async (req, res) => {
|
|
try {
|
|
const equipmentData = req.body;
|
|
|
|
// 필수 필드 검증
|
|
if (!equipmentData.equipment_code || !equipmentData.equipment_name) {
|
|
return res.status(400).json({
|
|
success: false,
|
|
message: '설비 코드와 설비명은 필수입니다.'
|
|
});
|
|
}
|
|
|
|
// 설비 코드 중복 확인
|
|
EquipmentModel.checkDuplicateCode(equipmentData.equipment_code, null, (error, isDuplicate) => {
|
|
if (error) {
|
|
console.error('설비 코드 중복 확인 오류:', error);
|
|
return res.status(500).json({
|
|
success: false,
|
|
message: '설비 코드 중복 확인 중 오류가 발생했습니다.'
|
|
});
|
|
}
|
|
|
|
if (isDuplicate) {
|
|
return res.status(409).json({
|
|
success: false,
|
|
message: '이미 사용 중인 설비 코드입니다.'
|
|
});
|
|
}
|
|
|
|
// 설비 생성
|
|
EquipmentModel.create(equipmentData, (error, result) => {
|
|
if (error) {
|
|
console.error('설비 생성 오류:', error);
|
|
return res.status(500).json({
|
|
success: false,
|
|
message: '설비 생성 중 오류가 발생했습니다.'
|
|
});
|
|
}
|
|
|
|
res.status(201).json({
|
|
success: true,
|
|
message: '설비가 성공적으로 생성되었습니다.',
|
|
data: result
|
|
});
|
|
});
|
|
});
|
|
} catch (error) {
|
|
console.error('설비 생성 오류:', error);
|
|
res.status(500).json({
|
|
success: false,
|
|
message: '서버 오류가 발생했습니다.'
|
|
});
|
|
}
|
|
},
|
|
|
|
// READ ALL - 모든 설비 조회 (필터링 가능)
|
|
getAllEquipments: (req, res) => {
|
|
try {
|
|
const filters = {
|
|
workplace_id: req.query.workplace_id,
|
|
equipment_type: req.query.equipment_type,
|
|
status: req.query.status,
|
|
search: req.query.search
|
|
};
|
|
|
|
EquipmentModel.getAll(filters, (error, results) => {
|
|
if (error) {
|
|
console.error('설비 조회 오류:', error);
|
|
return res.status(500).json({
|
|
success: false,
|
|
message: '설비 조회 중 오류가 발생했습니다.'
|
|
});
|
|
}
|
|
|
|
res.json({
|
|
success: true,
|
|
data: results
|
|
});
|
|
});
|
|
} catch (error) {
|
|
console.error('설비 조회 오류:', error);
|
|
res.status(500).json({
|
|
success: false,
|
|
message: '서버 오류가 발생했습니다.'
|
|
});
|
|
}
|
|
},
|
|
|
|
// READ ONE - 특정 설비 조회
|
|
getEquipmentById: (req, res) => {
|
|
try {
|
|
const equipmentId = req.params.id;
|
|
|
|
EquipmentModel.getById(equipmentId, (error, result) => {
|
|
if (error) {
|
|
console.error('설비 조회 오류:', error);
|
|
return res.status(500).json({
|
|
success: false,
|
|
message: '설비 조회 중 오류가 발생했습니다.'
|
|
});
|
|
}
|
|
|
|
if (!result) {
|
|
return res.status(404).json({
|
|
success: false,
|
|
message: '설비를 찾을 수 없습니다.'
|
|
});
|
|
}
|
|
|
|
res.json({
|
|
success: true,
|
|
data: result
|
|
});
|
|
});
|
|
} catch (error) {
|
|
console.error('설비 조회 오류:', error);
|
|
res.status(500).json({
|
|
success: false,
|
|
message: '서버 오류가 발생했습니다.'
|
|
});
|
|
}
|
|
},
|
|
|
|
// READ BY WORKPLACE - 특정 작업장의 설비 조회
|
|
getEquipmentsByWorkplace: (req, res) => {
|
|
try {
|
|
const workplaceId = req.params.workplaceId;
|
|
|
|
EquipmentModel.getByWorkplace(workplaceId, (error, results) => {
|
|
if (error) {
|
|
console.error('작업장 설비 조회 오류:', error);
|
|
return res.status(500).json({
|
|
success: false,
|
|
message: '작업장 설비 조회 중 오류가 발생했습니다.'
|
|
});
|
|
}
|
|
|
|
res.json({
|
|
success: true,
|
|
data: results
|
|
});
|
|
});
|
|
} catch (error) {
|
|
console.error('작업장 설비 조회 오류:', error);
|
|
res.status(500).json({
|
|
success: false,
|
|
message: '서버 오류가 발생했습니다.'
|
|
});
|
|
}
|
|
},
|
|
|
|
// READ ACTIVE - 활성 설비만 조회
|
|
getActiveEquipments: (req, res) => {
|
|
try {
|
|
EquipmentModel.getActive((error, results) => {
|
|
if (error) {
|
|
console.error('활성 설비 조회 오류:', error);
|
|
return res.status(500).json({
|
|
success: false,
|
|
message: '활성 설비 조회 중 오류가 발생했습니다.'
|
|
});
|
|
}
|
|
|
|
res.json({
|
|
success: true,
|
|
data: results
|
|
});
|
|
});
|
|
} catch (error) {
|
|
console.error('활성 설비 조회 오류:', error);
|
|
res.status(500).json({
|
|
success: false,
|
|
message: '서버 오류가 발생했습니다.'
|
|
});
|
|
}
|
|
},
|
|
|
|
// UPDATE - 설비 수정
|
|
updateEquipment: async (req, res) => {
|
|
try {
|
|
const equipmentId = req.params.id;
|
|
const equipmentData = req.body;
|
|
|
|
// 필수 필드 검증
|
|
if (!equipmentData.equipment_code || !equipmentData.equipment_name) {
|
|
return res.status(400).json({
|
|
success: false,
|
|
message: '설비 코드와 설비명은 필수입니다.'
|
|
});
|
|
}
|
|
|
|
// 설비 존재 확인
|
|
EquipmentModel.getById(equipmentId, (error, existingEquipment) => {
|
|
if (error) {
|
|
console.error('설비 조회 오류:', error);
|
|
return res.status(500).json({
|
|
success: false,
|
|
message: '설비 조회 중 오류가 발생했습니다.'
|
|
});
|
|
}
|
|
|
|
if (!existingEquipment) {
|
|
return res.status(404).json({
|
|
success: false,
|
|
message: '설비를 찾을 수 없습니다.'
|
|
});
|
|
}
|
|
|
|
// 설비 코드 중복 확인 (자신 제외)
|
|
EquipmentModel.checkDuplicateCode(equipmentData.equipment_code, equipmentId, (error, isDuplicate) => {
|
|
if (error) {
|
|
console.error('설비 코드 중복 확인 오류:', error);
|
|
return res.status(500).json({
|
|
success: false,
|
|
message: '설비 코드 중복 확인 중 오류가 발생했습니다.'
|
|
});
|
|
}
|
|
|
|
if (isDuplicate) {
|
|
return res.status(409).json({
|
|
success: false,
|
|
message: '이미 사용 중인 설비 코드입니다.'
|
|
});
|
|
}
|
|
|
|
// 설비 수정
|
|
EquipmentModel.update(equipmentId, equipmentData, (error, result) => {
|
|
if (error) {
|
|
console.error('설비 수정 오류:', error);
|
|
return res.status(500).json({
|
|
success: false,
|
|
message: '설비 수정 중 오류가 발생했습니다.'
|
|
});
|
|
}
|
|
|
|
res.json({
|
|
success: true,
|
|
message: '설비가 성공적으로 수정되었습니다.',
|
|
data: result
|
|
});
|
|
});
|
|
});
|
|
});
|
|
} catch (error) {
|
|
console.error('설비 수정 오류:', error);
|
|
res.status(500).json({
|
|
success: false,
|
|
message: '서버 오류가 발생했습니다.'
|
|
});
|
|
}
|
|
},
|
|
|
|
// UPDATE MAP POSITION - 지도상 위치 업데이트
|
|
updateMapPosition: (req, res) => {
|
|
try {
|
|
const equipmentId = req.params.id;
|
|
const positionData = {
|
|
map_x_percent: req.body.map_x_percent,
|
|
map_y_percent: req.body.map_y_percent,
|
|
map_width_percent: req.body.map_width_percent,
|
|
map_height_percent: req.body.map_height_percent
|
|
};
|
|
|
|
EquipmentModel.updateMapPosition(equipmentId, positionData, (error, result) => {
|
|
if (error) {
|
|
console.error('설비 위치 업데이트 오류:', error);
|
|
return res.status(500).json({
|
|
success: false,
|
|
message: '설비 위치 업데이트 중 오류가 발생했습니다.'
|
|
});
|
|
}
|
|
|
|
res.json({
|
|
success: true,
|
|
message: '설비 위치가 성공적으로 업데이트되었습니다.',
|
|
data: result
|
|
});
|
|
});
|
|
} catch (error) {
|
|
console.error('설비 위치 업데이트 오류:', error);
|
|
res.status(500).json({
|
|
success: false,
|
|
message: '서버 오류가 발생했습니다.'
|
|
});
|
|
}
|
|
},
|
|
|
|
// DELETE - 설비 삭제
|
|
deleteEquipment: (req, res) => {
|
|
try {
|
|
const equipmentId = req.params.id;
|
|
|
|
EquipmentModel.delete(equipmentId, (error, result) => {
|
|
if (error) {
|
|
console.error('설비 삭제 오류:', error);
|
|
return res.status(500).json({
|
|
success: false,
|
|
message: '설비 삭제 중 오류가 발생했습니다.'
|
|
});
|
|
}
|
|
|
|
res.json({
|
|
success: true,
|
|
message: '설비가 성공적으로 삭제되었습니다.',
|
|
data: result
|
|
});
|
|
});
|
|
} catch (error) {
|
|
console.error('설비 삭제 오류:', error);
|
|
res.status(500).json({
|
|
success: false,
|
|
message: '서버 오류가 발생했습니다.'
|
|
});
|
|
}
|
|
},
|
|
|
|
// GET EQUIPMENT TYPES - 사용 중인 설비 유형 목록 조회
|
|
getEquipmentTypes: (req, res) => {
|
|
try {
|
|
EquipmentModel.getEquipmentTypes((error, results) => {
|
|
if (error) {
|
|
console.error('설비 유형 조회 오류:', error);
|
|
return res.status(500).json({
|
|
success: false,
|
|
message: '설비 유형 조회 중 오류가 발생했습니다.'
|
|
});
|
|
}
|
|
|
|
res.json({
|
|
success: true,
|
|
data: results
|
|
});
|
|
});
|
|
} catch (error) {
|
|
console.error('설비 유형 조회 오류:', error);
|
|
res.status(500).json({
|
|
success: false,
|
|
message: '서버 오류가 발생했습니다.'
|
|
});
|
|
}
|
|
}
|
|
};
|
|
|
|
module.exports = EquipmentController;
|