feat: 대시보드 작업장 현황 지도 구현
- 실시간 작업장 현황을 지도로 시각화 - 작업장 관리 페이지에서 정의한 구역 정보 활용 - 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>
This commit is contained in:
@@ -10,7 +10,7 @@ const TbmController = {
|
||||
createSession: (req, res) => {
|
||||
const sessionData = {
|
||||
session_date: req.body.session_date,
|
||||
leader_id: req.body.leader_id,
|
||||
leader_id: req.body.leader_id || null,
|
||||
project_id: req.body.project_id || null,
|
||||
work_location: req.body.work_location || null,
|
||||
work_description: req.body.work_description || null,
|
||||
@@ -19,11 +19,11 @@ const TbmController = {
|
||||
created_by: req.user.user_id
|
||||
};
|
||||
|
||||
// 필수 필드 검증
|
||||
if (!sessionData.session_date || !sessionData.leader_id) {
|
||||
// 필수 필드 검증 (날짜만 필수, leader_id는 관리자의 경우 null 허용)
|
||||
if (!sessionData.session_date) {
|
||||
return res.status(400).json({
|
||||
success: false,
|
||||
message: 'TBM 날짜와 팀장 정보는 필수입니다.'
|
||||
message: 'TBM 날짜는 필수입니다.'
|
||||
});
|
||||
}
|
||||
|
||||
@@ -179,7 +179,7 @@ const TbmController = {
|
||||
// ==================== 팀 구성 관련 ====================
|
||||
|
||||
/**
|
||||
* 팀원 추가
|
||||
* 팀원 추가 (작업자별 상세 정보 포함)
|
||||
*/
|
||||
addTeamMember: (req, res) => {
|
||||
const assignmentData = {
|
||||
@@ -188,7 +188,12 @@ const TbmController = {
|
||||
assigned_role: req.body.assigned_role || null,
|
||||
work_detail: req.body.work_detail || null,
|
||||
is_present: req.body.is_present,
|
||||
absence_reason: req.body.absence_reason || null
|
||||
absence_reason: req.body.absence_reason || null,
|
||||
project_id: req.body.project_id || null,
|
||||
work_type_id: req.body.work_type_id || null,
|
||||
task_id: req.body.task_id || null,
|
||||
workplace_category_id: req.body.workplace_category_id || null,
|
||||
workplace_id: req.body.workplace_id || null
|
||||
};
|
||||
|
||||
if (!assignmentData.worker_id) {
|
||||
@@ -300,6 +305,30 @@ const TbmController = {
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* 세션의 모든 팀원 삭제 (수정 시 사용)
|
||||
*/
|
||||
clearAllTeamMembers: (req, res) => {
|
||||
const { sessionId } = req.params;
|
||||
|
||||
TbmModel.clearAllTeamMembers(sessionId, (err, result) => {
|
||||
if (err) {
|
||||
console.error('팀원 전체 삭제 오류:', err);
|
||||
return res.status(500).json({
|
||||
success: false,
|
||||
message: '팀원 전체 삭제 중 오류가 발생했습니다.',
|
||||
error: err.message
|
||||
});
|
||||
}
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
message: '모든 팀원이 삭제되었습니다.',
|
||||
data: { deletedCount: result.affectedRows }
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
// ==================== 안전 체크리스트 관련 ====================
|
||||
|
||||
/**
|
||||
@@ -564,6 +593,33 @@ const TbmController = {
|
||||
});
|
||||
}
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
data: results
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* 작업보고서가 작성되지 않은 TBM 팀 배정 조회
|
||||
*/
|
||||
getIncompleteWorkReports: (req, res) => {
|
||||
const userId = req.user.user_id;
|
||||
const accessLevel = req.user.access_level;
|
||||
|
||||
// 관리자는 모든 TBM 조회, 일반 사용자는 본인이 작성한 것만 조회
|
||||
const filterUserId = (accessLevel === 'system' || accessLevel === 'admin') ? null : userId;
|
||||
|
||||
TbmModel.getIncompleteWorkReports(filterUserId, (err, results) => {
|
||||
if (err) {
|
||||
console.error('미완료 작업보고서 조회 오류:', err);
|
||||
return res.status(500).json({
|
||||
success: false,
|
||||
message: '미완료 작업보고서 조회 중 오류가 발생했습니다.',
|
||||
error: err.message
|
||||
});
|
||||
}
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
data: results
|
||||
|
||||
Reference in New Issue
Block a user