feat: 설비 관리 시스템 구축

## 주요 기능
- 설비 등록/수정/삭제 기능
- 작업장별 설비 연결
- 작업장 지도에서 설비 위치 정의
- 필터링 및 검색 기능

## 백엔드
- 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>
This commit is contained in:
Hyungi Ahn
2026-01-28 09:22:57 +09:00
parent 9c98c44d8a
commit e1227a69fe
13 changed files with 2710 additions and 22 deletions

View File

@@ -0,0 +1,248 @@
# 2026-01-28: 설비 관리 시스템 구축
## 📋 작업 개요
작업장별 설비 정보를 등록하고 관리할 수 있는 시스템을 구축했습니다.
## ✅ 완료된 작업
### 1. 데이터베이스 구조
**파일:** `api.hyungi.net/db/migrations/20260128000000_add_layout_image_to_workplaces.js`
- workplaces 테이블에 `layout_image` 컬럼 추가
- 작업장별 레이아웃 이미지 경로 저장
**파일:** `api.hyungi.net/db/migrations/20260128010000_create_equipments_table.js`
- equipments 테이블 생성
- 필드:
- 기본 정보: equipment_code, equipment_name, equipment_type
- 상세 정보: manufacturer, model_name, serial_number, installation_date
- 작업장 연결: workplace_id (외래키)
- 지도 위치: map_x_percent, map_y_percent, map_width_percent, map_height_percent
- 상태 관리: status (active, maintenance, inactive)
### 2. 백엔드 API
**파일:** `api.hyungi.net/models/equipmentModel.js`
- 설비 CRUD 작업
- 필터링 기능 (작업장, 유형, 상태, 검색)
- 지도 위치 업데이트
- 설비 코드 중복 확인
- 사용 중인 설비 유형 목록 조회
**파일:** `api.hyungi.net/controllers/equipmentController.js`
- 설비 생성/조회/수정/삭제 컨트롤러
- 유효성 검사 및 에러 처리
- 작업장별/유형별 필터링
**파일:** `api.hyungi.net/routes/equipmentRoutes.js`
- `/api/equipments` 엔드포인트
- REST API 구현 (GET, POST, PUT, PATCH, DELETE)
**파일:** `api.hyungi.net/config/routes.js`
- 설비 라우트 등록 (line 44, 142)
### 3. 프론트엔드
**파일:** `web-ui/pages/admin/equipments.html`
- 설비 관리 페이지 UI
- 필터링 섹션 (작업장, 유형, 상태, 검색)
- 설비 목록 테이블
- 설비 추가/수정 모달
**파일:** `web-ui/js/equipment-management.js`
- 설비 데이터 로드 및 렌더링
- 필터링 및 검색 기능
- CRUD 작업 처리
- 작업장/유형 드롭다운 자동 채우기
### 4. 작업장 관리 개선
**파일:** `web-ui/pages/admin/workplaces.html`
- 작업장 지도 모달 추가 (line 254-329)
- 설비 위치 정의 기능 (캔버스 기반 드래그)
**파일:** `web-ui/js/workplace-management.js`
- 작업장 레이아웃 이미지 업로드 (line 828-878)
- 설비 영역 정의 및 저장 (line 943-1126)
- 백분율 기반 좌표 시스템
### 5. 권한 시스템 연동
- pages 테이블에 설비 관리 페이지 등록
- page_key: `equipments`
- 경로: `/pages/admin/equipments.html`
- Admin 전용 페이지
## 🐛 버그 수정
### 1. 이미지 보존 로직 개선
**파일:** `api.hyungi.net/controllers/workplaceController.js`
- **위치:** line 130-136 (updateCategory), line 310-316 (updateWorkplace)
- **문제:** `null` 값으로 인한 이미지 삭제
- **해결:** `undefined``null` 모두 체크하도록 개선
```javascript
// 변경 전
layout_image: categoryData.layout_image !== undefined
? categoryData.layout_image
: existingCategory.layout_image
// 변경 후
layout_image: (categoryData.layout_image !== undefined && categoryData.layout_image !== null)
? categoryData.layout_image
: existingCategory.layout_image
```
### 2. 작업장 레이아웃 이미지 업로드 경로 수정
**파일:** `api.hyungi.net/routes/workplaceRoutes.js`
- **위치:** line 11
- **문제:** Docker 볼륨 마운트와 업로드 경로 불일치
- **해결:** `../public/uploads``../uploads`로 변경
## 📁 파일 구조
```
api.hyungi.net/
├── controllers/
│ ├── equipmentController.js (신규)
│ └── workplaceController.js (수정)
├── models/
│ └── equipmentModel.js (신규)
├── routes/
│ ├── equipmentRoutes.js (신규)
│ └── workplaceRoutes.js (수정)
├── config/
│ └── routes.js (수정)
└── db/migrations/
├── 20260128000000_add_layout_image_to_workplaces.js (신규)
└── 20260128010000_create_equipments_table.js (신규)
web-ui/
├── pages/admin/
│ ├── equipments.html (신규)
│ └── workplaces.html (수정)
└── js/
├── equipment-management.js (신규)
└── workplace-management.js (수정)
```
## 🎯 주요 기능
### 설비 관리
- ✅ 설비 등록/수정/삭제
- ✅ 작업장별 연결
- ✅ 설비 유형별 분류
- ✅ 상태 관리 (활성/정비중/비활성)
- ✅ 상세 정보 관리 (제조사, 모델명, 시리얼 번호, 설치일)
- ✅ 필터링 및 검색
### 작업장 지도 연동
- ✅ 작업장 레이아웃 이미지 업로드
- ✅ 설비 위치 캔버스 드래그로 정의
- ✅ 백분율 기반 좌표 (반응형 지원)
## 🔗 API 엔드포인트
```
POST /api/equipments - 설비 생성
GET /api/equipments - 설비 목록 조회 (필터링 가능)
GET /api/equipments/active/list - 활성 설비 조회
GET /api/equipments/types - 설비 유형 목록
GET /api/equipments/:id - 설비 상세 조회
PUT /api/equipments/:id - 설비 수정
PATCH /api/equipments/:id/map-position - 지도 위치 업데이트
DELETE /api/equipments/:id - 설비 삭제
```
## 🚀 사용 방법
1. **설비 관리 페이지 접속**
- URL: http://localhost:20000/pages/admin/equipments.html
2. **설비 추가**
- "설비 추가" 버튼 클릭
- 필수 정보 입력 (설비 코드, 설비명)
- 선택 정보 입력 (유형, 작업장, 제조사 등)
- 저장
3. **작업장 지도에서 설비 위치 정의**
- 작업장 관리 페이지 접속
- 작업장 카드에서 🗺️ 버튼 클릭
- Step 1: 레이아웃 이미지 업로드
- Step 2: 설비 영역 드래그로 정의
4. **필터링 및 검색**
- 작업장별 필터
- 유형별 필터
- 상태별 필터
- 설비명/코드 검색
## 📊 데이터베이스 변경사항
### workplaces 테이블
```sql
ALTER TABLE workplaces
ADD COLUMN layout_image VARCHAR(500) NULL COMMENT '작업장 레이아웃 이미지 경로';
```
### equipments 테이블 (신규)
```sql
CREATE TABLE equipments (
equipment_id INT AUTO_INCREMENT PRIMARY KEY,
equipment_code VARCHAR(50) UNIQUE NOT NULL,
equipment_name VARCHAR(100) NOT NULL,
equipment_type VARCHAR(50),
model_name VARCHAR(100),
manufacturer VARCHAR(100),
installation_date DATE,
serial_number VARCHAR(100),
specifications TEXT,
status ENUM('active', 'maintenance', 'inactive') DEFAULT 'active',
notes TEXT,
workplace_id INT,
map_x_percent DECIMAL(5,2),
map_y_percent DECIMAL(5,2),
map_width_percent DECIMAL(5,2),
map_height_percent DECIMAL(5,2),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (workplace_id) REFERENCES workplaces(workplace_id) ON DELETE SET NULL,
INDEX idx_workplace (workplace_id),
INDEX idx_type (equipment_type),
INDEX idx_status (status)
);
```
### pages 테이블
```sql
INSERT INTO pages (page_key, page_name, page_path, category, description, is_admin_only, display_order)
VALUES ('equipments', '설비 관리', '/pages/admin/equipments.html', '관리',
'작업장별 설비 정보를 등록하고 관리합니다', 1, 35);
```
## 💡 기술적 고려사항
### 1. 백분율 기반 좌표 시스템
- 반응형 지원을 위해 픽셀 대신 백분율 사용
- 다양한 화면 크기에서 일관된 표시
### 2. Docker 볼륨 마운트
- `/uploads` 폴더로 통일
- 컨테이너 재시작 시에도 파일 유지
### 3. 이미지 보존 로직
- null과 undefined 모두 처리
- 의도하지 않은 이미지 삭제 방지
## 🔄 향후 개선사항
- [ ] 설비 이력 관리 (정비 내역, 고장 이력)
- [ ] 설비 성능 지표 추적
- [ ] 설비별 작업 배정 기능
- [ ] 설비 가동률 통계
- [ ] QR 코드 스캔 기능
- [ ] 설비 이미지 업로드
## 📝 참고사항
- API 컨테이너는 자동으로 재시작되어 변경사항 반영
- 기존 작업장 레이아웃 이미지는 수동으로 이동됨
- 권한은 Admin 전용으로 설정됨