일일순회점검
-작업장을 순회하며 안전 및 정리정돈 상태를 점검합니다
-diff --git a/api.hyungi.net/controllers/workerController.js b/api.hyungi.net/controllers/workerController.js index 9bc667d..27ed407 100644 --- a/api.hyungi.net/controllers/workerController.js +++ b/api.hyungi.net/controllers/workerController.js @@ -26,12 +26,7 @@ exports.createWorker = asyncHandler(async (req, res) => { logger.info('작업자 생성 요청', { name: workerData.worker_name, create_account: createAccount }); - const lastID = await new Promise((resolve, reject) => { - workerModel.create(workerData, (err, id) => { - if (err) reject(new DatabaseError('작업자 생성 중 오류가 발생했습니다')); - else resolve(id); - }); - }); + const lastID = await workerModel.create(workerData); // 계정 생성 요청이 있으면 users 테이블에 계정 생성 if (createAccount && workerData.worker_name) { @@ -73,7 +68,7 @@ exports.createWorker = asyncHandler(async (req, res) => { * 전체 작업자 조회 (캐싱 및 페이지네이션 적용) */ exports.getAllWorkers = asyncHandler(async (req, res) => { - const { page = 1, limit = 10, search = '', status = '', department_id = null } = req.query; + const { page = 1, limit = 100, search = '', status = '', department_id = null } = req.query; const cacheKey = cache.createKey('workers', 'list', page, limit, search, status, department_id); @@ -114,12 +109,7 @@ exports.getWorkerById = asyncHandler(async (req, res) => { throw new ValidationError('유효하지 않은 작업자 ID입니다'); } - const row = await new Promise((resolve, reject) => { - workerModel.getById(id, (err, data) => { - if (err) reject(new DatabaseError('작업자 조회 중 오류가 발생했습니다')); - else resolve(data); - }); - }); + const row = await workerModel.getById(id); if (!row) { throw new NotFoundError('작업자를 찾을 수 없습니다'); @@ -153,27 +143,14 @@ exports.updateWorker = asyncHandler(async (req, res) => { }); // 먼저 현재 작업자 정보 조회 (계정 여부 확인용) - const currentWorker = await new Promise((resolve, reject) => { - workerModel.getById(id, (err, data) => { - if (err) reject(new DatabaseError('작업자 조회 중 오류가 발생했습니다')); - else resolve(data); - }); - }); + const currentWorker = await workerModel.getById(id); if (!currentWorker) { throw new NotFoundError('작업자를 찾을 수 없습니다'); } // 작업자 정보 업데이트 - const changes = await new Promise((resolve, reject) => { - workerModel.update(workerData, (err, affected) => { - if (err) { - console.error('❌ workerModel.update 에러:', err); - reject(new DatabaseError(`작업자 수정 중 오류가 발생했습니다: ${err.message}`)); - } - else resolve(affected); - }); - }); + const changes = await workerModel.update(workerData); // 계정 생성/해제 처리 const db = await getDb(); @@ -281,12 +258,7 @@ exports.removeWorker = asyncHandler(async (req, res) => { throw new ValidationError('유효하지 않은 작업자 ID입니다'); } - const changes = await new Promise((resolve, reject) => { - workerModel.remove(id, (err, affected) => { - if (err) reject(new DatabaseError('작업자 삭제 중 오류가 발생했습니다')); - else resolve(affected); - }); - }); + const changes = await workerModel.remove(id); if (changes === 0) { throw new NotFoundError('작업자를 찾을 수 없습니다'); diff --git a/api.hyungi.net/models/attendanceModel.js b/api.hyungi.net/models/attendanceModel.js index 6298ec9..3e6217b 100644 --- a/api.hyungi.net/models/attendanceModel.js +++ b/api.hyungi.net/models/attendanceModel.js @@ -201,13 +201,15 @@ class AttendanceModel { const { record_date, worker_id, - total_work_hours, - work_attendance_type_id, - vacation_type_id, - is_overtime_approved, - created_by + total_work_hours = 8, + work_attendance_type_id = 1, + vacation_type_id = null, + is_overtime_approved = false, + created_by = 1 } = recordData; + const attendance_type_id = work_attendance_type_id; + // 기존 기록 확인 const [existing] = await db.execute( 'SELECT id FROM daily_attendance_records WHERE worker_id = ? AND record_date = ?', @@ -217,17 +219,17 @@ class AttendanceModel { if (existing.length > 0) { // 업데이트 const [result] = await db.execute(` - UPDATE daily_attendance_records - SET + UPDATE daily_attendance_records + SET total_work_hours = ?, - work_attendance_type_id = ?, + attendance_type_id = ?, vacation_type_id = ?, is_overtime_approved = ?, updated_at = CURRENT_TIMESTAMP WHERE id = ? `, [ total_work_hours, - work_attendance_type_id, + attendance_type_id, vacation_type_id, is_overtime_approved, existing[0].id @@ -238,14 +240,14 @@ class AttendanceModel { // 생성 const [result] = await db.execute(` INSERT INTO daily_attendance_records ( - record_date, worker_id, total_work_hours, work_attendance_type_id, + record_date, worker_id, total_work_hours, attendance_type_id, vacation_type_id, is_overtime_approved, created_by ) VALUES (?, ?, ?, ?, ?, ?, ?) `, [ record_date, worker_id, total_work_hours, - work_attendance_type_id, + attendance_type_id, vacation_type_id, is_overtime_approved, created_by diff --git a/api.hyungi.net/services/attendanceService.js b/api.hyungi.net/services/attendanceService.js index 8a2fe02..5422113 100644 --- a/api.hyungi.net/services/attendanceService.js +++ b/api.hyungi.net/services/attendanceService.js @@ -95,12 +95,9 @@ const upsertAttendanceRecordService = async (recordData) => { record_date, worker_id, total_work_hours, - attendance_type_id, + work_attendance_type_id: attendance_type_id, vacation_type_id, - is_vacation_processed, - overtime_approved, - status, - notes, + is_overtime_approved: overtime_approved, created_by }); diff --git a/web-ui/js/vacation-common.js b/web-ui/js/vacation-common.js index 5a88c3e..f065469 100644 --- a/web-ui/js/vacation-common.js +++ b/web-ui/js/vacation-common.js @@ -15,7 +15,7 @@ window.VacationCommon = { */ async function loadWorkers() { try { - const response = await axios.get('/workers'); + const response = await axios.get('/workers?limit=100'); if (response.data.success) { window.VacationCommon.workers = response.data.data.filter(w => w.employment_status === 'employed'); return window.VacationCommon.workers; diff --git a/web-ui/pages/admin/attendance-report.html b/web-ui/pages/admin/attendance-report.html index 532bca8..76f474c 100644 --- a/web-ui/pages/admin/attendance-report.html +++ b/web-ui/pages/admin/attendance-report.html @@ -264,7 +264,7 @@ async function loadWorkers() { try { - const response = await axios.get('/workers'); + const response = await axios.get('/workers?limit=100'); if (response.data.success) { workers = response.data.data.filter(w => w.employment_status === 'employed'); diff --git a/web-ui/pages/attendance/checkin.html b/web-ui/pages/attendance/checkin.html index 3bf4d59..6ec6dd8 100644 --- a/web-ui/pages/attendance/checkin.html +++ b/web-ui/pages/attendance/checkin.html @@ -251,12 +251,13 @@ try { const [workersRes, checkinRes, recordsRes] = await Promise.all([ - axios.get('/workers'), + axios.get('/workers?limit=100'), axios.get(`/attendance/checkin-list?date=${selectedDate}`).catch(() => ({ data: { data: [] } })), axios.get(`/attendance/daily-records?date=${selectedDate}`).catch(() => ({ data: { data: [] } })) ]); - workers = (workersRes.data.data || []).filter(w => w.employment_status === 'employed'); + const allWorkers = workersRes.data.data || []; + workers = allWorkers.filter(w => w.status === 'active' && (!w.employment_status || w.employment_status === 'employed')); const checkinList = checkinRes.data.data || []; const records = recordsRes.data.data || []; diff --git a/web-ui/pages/attendance/daily.html b/web-ui/pages/attendance/daily.html index 61e7392..7ae1a55 100644 --- a/web-ui/pages/attendance/daily.html +++ b/web-ui/pages/attendance/daily.html @@ -149,7 +149,7 @@ async function loadWorkers() { try { - const response = await axios.get('/workers'); + const response = await axios.get('/workers?limit=100'); if (response.data.success) { workers = response.data.data.filter(w => w.employment_status === 'employed'); } diff --git a/web-ui/pages/attendance/monthly.html b/web-ui/pages/attendance/monthly.html index 82596ff..5ae2a11 100644 --- a/web-ui/pages/attendance/monthly.html +++ b/web-ui/pages/attendance/monthly.html @@ -284,7 +284,7 @@ async function loadWorkers() { try { - const response = await axios.get('/workers'); + const response = await axios.get('/workers?limit=100'); if (response.data.success) { workers = response.data.data.filter(w => w.employment_status === 'employed'); diff --git a/web-ui/pages/attendance/work-status.html b/web-ui/pages/attendance/work-status.html index 83aa522..b964929 100644 --- a/web-ui/pages/attendance/work-status.html +++ b/web-ui/pages/attendance/work-status.html @@ -367,11 +367,11 @@ try { const [workersRes, recordsRes] = await Promise.all([ - axios.get('/workers'), + axios.get('/workers?limit=100'), axios.get(`/attendance/daily-records?date=${selectedDate}`).catch(() => ({ data: { data: [] } })) ]); - workers = (workersRes.data.data || []).filter(w => w.employment_status === 'employed'); + workers = (workersRes.data.data || []).filter(w => w.status === 'active' && (!w.employment_status || w.employment_status === 'employed')); const records = recordsRes.data.data || []; // 출근 체크 데이터가 있는지 확인 @@ -415,7 +415,8 @@ isPresent: record.is_present === 1, type: type, hours: attendanceTypes.find(t => t.value === type)?.hours || 8, - overtimeHours: overtimeHours + overtimeHours: overtimeHours, + isSaved: record.attendance_type_id != null || record.total_work_hours > 0 }; } else { // 데이터 없으면 기본값 (출근, 정시근무) @@ -423,7 +424,8 @@ isPresent: true, type: 'normal', hours: 8, - overtimeHours: 0 + overtimeHours: 0, + isSaved: false }; } }); @@ -451,11 +453,12 @@ const showOvertimeInput = s.type === 'overtime'; return ` -
작업장을 순회하며 안전 및 정리정돈 상태를 점검합니다
-