- 실시간 작업장 현황을 지도로 시각화 - 작업장 관리 페이지에서 정의한 구역 정보 활용 - TBM 작업자 및 방문자 현황 표시 주요 변경사항: - dashboard.html: 작업장 현황 섹션 추가 (기존 작업 현황 테이블 제거) - workplace-status.js: 지도 렌더링 및 데이터 통합 로직 구현 - modern-dashboard.js: 삭제된 DOM 요소 조건부 체크 추가 시각화 방식: - 인원 없음: 회색 테두리 + 작업장 이름 - 내부 작업자: 파란색 영역 + 인원 수 - 외부 방문자: 보라색 영역 + 인원 수 - 둘 다: 초록색 영역 + 총 인원 수 기술 구현: - Canvas API 기반 사각형 영역 렌더링 - map-regions API를 통한 데이터 일관성 보장 - 클릭 이벤트로 상세 정보 모달 표시 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
133 lines
3.0 KiB
JavaScript
133 lines
3.0 KiB
JavaScript
/**
|
|
* vacationTypeModel.js
|
|
* 휴가 유형 관련 데이터베이스 쿼리 모델
|
|
*/
|
|
|
|
const { getDb } = require('../dbPool');
|
|
|
|
const vacationTypeModel = {
|
|
/**
|
|
* 모든 활성 휴가 유형 조회 (우선순위 순서대로)
|
|
*/
|
|
async getAll(callback) {
|
|
try {
|
|
const db = await getDb();
|
|
const query = `
|
|
SELECT *
|
|
FROM vacation_types
|
|
WHERE is_active = 1
|
|
ORDER BY priority ASC, id ASC
|
|
`;
|
|
const [rows] = await db.query(query);
|
|
callback(null, rows);
|
|
} catch (error) {
|
|
callback(error);
|
|
}
|
|
},
|
|
|
|
/**
|
|
* 시스템 기본 휴가 유형만 조회
|
|
*/
|
|
async getSystemTypes(callback) {
|
|
try {
|
|
const db = await getDb();
|
|
const query = `
|
|
SELECT *
|
|
FROM vacation_types
|
|
WHERE is_system = 1 AND is_active = 1
|
|
ORDER BY priority ASC
|
|
`;
|
|
const [rows] = await db.query(query);
|
|
callback(null, rows);
|
|
} catch (error) {
|
|
callback(error);
|
|
}
|
|
},
|
|
|
|
/**
|
|
* 특정 ID로 휴가 유형 조회
|
|
*/
|
|
async getById(id, callback) {
|
|
try {
|
|
const db = await getDb();
|
|
const query = `SELECT * FROM vacation_types WHERE id = ?`;
|
|
const [rows] = await db.query(query, [id]);
|
|
callback(null, rows);
|
|
} catch (error) {
|
|
callback(error);
|
|
}
|
|
},
|
|
|
|
/**
|
|
* 휴가 유형 코드로 조회
|
|
*/
|
|
async getByCode(code, callback) {
|
|
try {
|
|
const db = await getDb();
|
|
const query = `SELECT * FROM vacation_types WHERE type_code = ?`;
|
|
const [rows] = await db.query(query, [code]);
|
|
callback(null, rows);
|
|
} catch (error) {
|
|
callback(error);
|
|
}
|
|
},
|
|
|
|
/**
|
|
* 휴가 유형 생성
|
|
*/
|
|
async create(typeData, callback) {
|
|
try {
|
|
const db = await getDb();
|
|
const query = `INSERT INTO vacation_types SET ?`;
|
|
const [result] = await db.query(query, typeData);
|
|
callback(null, result);
|
|
} catch (error) {
|
|
callback(error);
|
|
}
|
|
},
|
|
|
|
/**
|
|
* 휴가 유형 수정
|
|
*/
|
|
async update(id, updateData, callback) {
|
|
try {
|
|
const db = await getDb();
|
|
const query = `UPDATE vacation_types SET ? WHERE id = ?`;
|
|
const [result] = await db.query(query, [updateData, id]);
|
|
callback(null, result);
|
|
} catch (error) {
|
|
callback(error);
|
|
}
|
|
},
|
|
|
|
/**
|
|
* 휴가 유형 삭제 (논리적 삭제 - is_active = 0)
|
|
*/
|
|
async delete(id, callback) {
|
|
try {
|
|
const db = await getDb();
|
|
const query = `UPDATE vacation_types SET is_active = 0, updated_at = NOW() WHERE id = ?`;
|
|
const [result] = await db.query(query, [id]);
|
|
callback(null, result);
|
|
} catch (error) {
|
|
callback(error);
|
|
}
|
|
},
|
|
|
|
/**
|
|
* 우선순위 업데이트
|
|
*/
|
|
async updatePriority(id, priority, callback) {
|
|
try {
|
|
const db = await getDb();
|
|
const query = `UPDATE vacation_types SET priority = ?, updated_at = NOW() WHERE id = ?`;
|
|
const [result] = await db.query(query, [priority, id]);
|
|
callback(null, result);
|
|
} catch (error) {
|
|
callback(error);
|
|
}
|
|
}
|
|
};
|
|
|
|
module.exports = vacationTypeModel;
|