refactor: worker_id → user_id 전체 마이그레이션 (Phase 1-4)

sso_users.user_id를 단일 식별자로 통합. JWT에서 worker_id 제거,
department_id/is_production 추가. 백엔드 15개 모델, 11개 컨트롤러,
4개 서비스, 7개 라우트, 프론트엔드 32+ JS/11+ HTML 변환.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Hyungi Ahn
2026-03-05 13:13:10 +09:00
parent 2197cdb3d5
commit abd7564e6b
90 changed files with 1790 additions and 925 deletions

View File

@@ -8,11 +8,11 @@ const TbmModel = {
const db = await getDb();
const [result] = await db.query(
`INSERT INTO tbm_sessions
(session_date, leader_id, project_id, work_type_id, task_id, work_location, created_by)
(session_date, leader_user_id, project_id, work_type_id, task_id, work_location, created_by)
VALUES (?, ?, ?, ?, ?, ?, ?)`,
[
sessionData.session_date,
sessionData.leader_id,
sessionData.leader_user_id,
sessionData.project_id || null,
sessionData.work_type_id || null,
sessionData.task_id || null,
@@ -32,7 +32,7 @@ const TbmModel = {
w.job_type as leader_job_type,
u.username as created_by_username,
u.name as created_by_name,
COUNT(DISTINCT ta.worker_id) as team_member_count,
COUNT(DISTINCT ta.user_id) as team_member_count,
GROUP_CONCAT(DISTINCT w2.worker_name ORDER BY ta.assignment_id SEPARATOR ', ') as team_member_names,
(SELECT COUNT(*) FROM tbm_transfers tf
WHERE (tf.source_session_id = s.session_id OR tf.dest_session_id = s.session_id)
@@ -46,10 +46,10 @@ const TbmModel = {
first_t.task_name,
first_wp.workplace_name as work_location
FROM tbm_sessions s
LEFT JOIN workers w ON s.leader_id = w.worker_id
LEFT JOIN workers w ON s.leader_user_id = w.user_id
LEFT JOIN sso_users u ON s.created_by = u.user_id
LEFT JOIN tbm_team_assignments ta ON s.session_id = ta.session_id
LEFT JOIN workers w2 ON ta.worker_id = w2.worker_id
LEFT JOIN workers w2 ON ta.user_id = w2.user_id
LEFT JOIN (
SELECT * FROM tbm_team_assignments
WHERE (session_id, assignment_id) IN (
@@ -80,7 +80,7 @@ const TbmModel = {
w.phone_number as leader_phone,
u.username as created_by_username,
u.name as created_by_name,
COUNT(DISTINCT ta.worker_id) as team_member_count,
COUNT(DISTINCT ta.user_id) as team_member_count,
first_p.project_name,
first_p.job_no,
first_wt.name as work_type_name,
@@ -90,7 +90,7 @@ const TbmModel = {
first_wp.workplace_name as work_location,
first_wc.category_name as workplace_category_name
FROM tbm_sessions s
LEFT JOIN workers w ON s.leader_id = w.worker_id
LEFT JOIN workers w ON s.leader_user_id = w.user_id
LEFT JOIN sso_users u ON s.created_by = u.user_id
LEFT JOIN tbm_team_assignments ta ON s.session_id = ta.session_id
LEFT JOIN (
@@ -165,8 +165,8 @@ const TbmModel = {
await conn.query(
`UPDATE tbm_team_assignments
SET attendance_type = ?, attendance_hours = ?
WHERE session_id = ? AND worker_id = ?`,
[item.attendance_type, item.attendance_hours || null, sessionId, item.worker_id]
WHERE session_id = ? AND user_id = ?`,
[item.attendance_type, item.attendance_hours || null, sessionId, item.user_id]
);
}
@@ -174,8 +174,8 @@ const TbmModel = {
const annualWorkers = attendanceData.filter(a => a.attendance_type === 'annual');
for (const aw of annualWorkers) {
const [assignRows] = await conn.query(
'SELECT assignment_id FROM tbm_team_assignments WHERE session_id = ? AND worker_id = ?',
[sessionId, aw.worker_id]
'SELECT assignment_id FROM tbm_team_assignments WHERE session_id = ? AND user_id = ?',
[sessionId, aw.user_id]
);
if (assignRows.length > 0) {
const [existingReport] = await conn.query(
@@ -185,9 +185,9 @@ const TbmModel = {
if (existingReport.length === 0) {
await conn.query(
`INSERT INTO daily_work_reports
(report_date, worker_id, project_id, work_hours, work_status_id, created_by, tbm_assignment_id, created_at)
(report_date, user_id, project_id, work_hours, work_status_id, created_by, tbm_assignment_id, created_at)
VALUES (?, ?, 13, 8, 1, ?, ?, NOW())`,
[reportDate, aw.worker_id, createdBy, assignRows[0].assignment_id]
[reportDate, aw.user_id, createdBy, assignRows[0].assignment_id]
);
}
}
@@ -207,7 +207,7 @@ const TbmModel = {
for (const aw of annualWorkers) {
try {
const AttendanceModel = require('./attendanceModel');
await AttendanceModel.syncWithWorkReports(aw.worker_id, reportDate);
await AttendanceModel.syncWithWorkReports(aw.user_id, reportDate);
} catch (syncErr) {
// 근태 동기화 오류 (무시됨)
}
@@ -237,7 +237,7 @@ const TbmModel = {
const db = await getDb();
const [result] = await db.query(
`INSERT INTO tbm_team_assignments
(session_id, worker_id, split_seq, assigned_role, work_detail, is_present, absence_reason,
(session_id, user_id, split_seq, assigned_role, work_detail, is_present, absence_reason,
project_id, work_type_id, task_id, workplace_category_id, workplace_id, work_hours)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
ON DUPLICATE KEY UPDATE
@@ -253,7 +253,7 @@ const TbmModel = {
work_hours = COALESCE(VALUES(work_hours), work_hours)`,
[
assignmentData.session_id,
assignmentData.worker_id,
assignmentData.user_id,
assignmentData.split_seq || 0,
assignmentData.assigned_role,
assignmentData.work_detail,
@@ -273,19 +273,19 @@ const TbmModel = {
addSplitAssignment: async (assignmentData) => {
const db = await getDb();
const [maxRows] = await db.query(
'SELECT COALESCE(MAX(split_seq), -1) as max_seq FROM tbm_team_assignments WHERE session_id = ? AND worker_id = ?',
[assignmentData.session_id, assignmentData.worker_id]
'SELECT COALESCE(MAX(split_seq), -1) as max_seq FROM tbm_team_assignments WHERE session_id = ? AND user_id = ?',
[assignmentData.session_id, assignmentData.user_id]
);
const nextSeq = (maxRows[0].max_seq || 0) + 1;
const [result] = await db.query(
`INSERT INTO tbm_team_assignments
(session_id, worker_id, split_seq, work_hours, project_id, work_type_id,
(session_id, user_id, split_seq, work_hours, project_id, work_type_id,
task_id, workplace_category_id, workplace_id, is_present)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, 1)`,
[
assignmentData.session_id,
assignmentData.worker_id,
assignmentData.user_id,
nextSeq,
assignmentData.work_hours,
assignmentData.project_id || null,
@@ -306,7 +306,7 @@ const TbmModel = {
const db = await getDb();
const values = members.map(m => [
sessionId,
m.worker_id,
m.user_id,
m.assigned_role || null,
m.work_detail || null,
m.is_present !== undefined ? m.is_present : true,
@@ -320,7 +320,7 @@ const TbmModel = {
const [result] = await db.query(
`INSERT INTO tbm_team_assignments
(session_id, worker_id, assigned_role, work_detail, is_present, absence_reason,
(session_id, user_id, assigned_role, work_detail, is_present, absence_reason,
project_id, work_type_id, task_id, workplace_category_id, workplace_id)
VALUES ?`,
[values]
@@ -343,7 +343,7 @@ const TbmModel = {
wc.category_name AS workplace_category_name,
wp.workplace_name
FROM tbm_team_assignments ta
INNER JOIN workers w ON ta.worker_id = w.worker_id
INNER JOIN workers w ON ta.user_id = w.user_id
LEFT JOIN projects p ON ta.project_id = p.project_id
LEFT JOIN work_types wt ON ta.work_type_id = wt.id
LEFT JOIN tasks t ON ta.task_id = t.task_id
@@ -359,7 +359,7 @@ const TbmModel = {
removeTeamMember: async (sessionId, workerId) => {
const db = await getDb();
const [result] = await db.query(
`DELETE FROM tbm_team_assignments WHERE session_id = ? AND worker_id = ?`,
`DELETE FROM tbm_team_assignments WHERE session_id = ? AND user_id = ?`,
[sessionId, workerId]
);
return result;
@@ -464,13 +464,13 @@ const TbmModel = {
const db = await getDb();
const [result] = await db.query(
`INSERT INTO team_handovers
(session_id, from_leader_id, to_leader_id, handover_date, handover_time,
(session_id, from_leader_user_id, to_leader_user_id, handover_date, handover_time,
reason, handover_notes, worker_ids)
VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,
[
handoverData.session_id,
handoverData.from_leader_id,
handoverData.to_leader_id,
handoverData.from_leader_user_id,
handoverData.to_leader_user_id,
handoverData.handover_date,
handoverData.handover_time,
handoverData.reason,
@@ -502,8 +502,8 @@ const TbmModel = {
u.username as confirmed_by_username,
u.name as confirmed_by_name
FROM team_handovers h
INNER JOIN workers w1 ON h.from_leader_id = w1.worker_id
INNER JOIN workers w2 ON h.to_leader_id = w2.worker_id
INNER JOIN workers w1 ON h.from_leader_user_id = w1.user_id
INNER JOIN workers w2 ON h.to_leader_user_id = w2.user_id
LEFT JOIN sso_users u ON h.confirmed_by = u.user_id
WHERE h.handover_date = ?
ORDER BY h.handover_time DESC`,
@@ -521,9 +521,9 @@ const TbmModel = {
w1.phone_number as from_leader_phone,
s.work_location
FROM team_handovers h
INNER JOIN workers w1 ON h.from_leader_id = w1.worker_id
INNER JOIN workers w1 ON h.from_leader_user_id = w1.user_id
LEFT JOIN tbm_sessions s ON h.session_id = s.session_id
WHERE h.to_leader_id = ? AND h.is_confirmed = 0
WHERE h.to_leader_user_id = ? AND h.is_confirmed = 0
ORDER BY h.handover_date DESC, h.handover_time DESC`,
[toLeaderId]
);
@@ -538,7 +538,7 @@ const TbmModel = {
`SELECT
DATE(session_date) as date,
COUNT(DISTINCT session_id) as session_count,
COUNT(DISTINCT leader_id) as leader_count,
COUNT(DISTINCT leader_user_id) as leader_count,
SUM(CASE WHEN status = 'completed' THEN 1 ELSE 0 END) as completed_count
FROM tbm_sessions
WHERE session_date BETWEEN ? AND ?
@@ -553,16 +553,16 @@ const TbmModel = {
const db = await getDb();
const [rows] = await db.query(
`SELECT
s.leader_id,
s.leader_user_id,
w.worker_name as leader_name,
COUNT(DISTINCT s.session_id) as total_sessions,
SUM(CASE WHEN s.status = 'completed' THEN 1 ELSE 0 END) as completed_sessions,
COUNT(DISTINCT ta.worker_id) as total_team_members
COUNT(DISTINCT ta.user_id) as total_team_members
FROM tbm_sessions s
INNER JOIN workers w ON s.leader_id = w.worker_id
INNER JOIN workers w ON s.leader_user_id = w.user_id
LEFT JOIN tbm_team_assignments ta ON s.session_id = ta.session_id
WHERE s.session_date BETWEEN ? AND ?
GROUP BY s.leader_id
GROUP BY s.leader_user_id
ORDER BY total_sessions DESC`,
[startDate, endDate]
);
@@ -597,7 +597,7 @@ const TbmModel = {
`SELECT
ta.assignment_id,
ta.session_id,
ta.worker_id,
ta.user_id,
ta.project_id,
ta.work_type_id,
ta.task_id,
@@ -620,9 +620,9 @@ const TbmModel = {
lw.worker_name as leader_name
FROM tbm_team_assignments ta
INNER JOIN tbm_sessions s ON ta.session_id = s.session_id
INNER JOIN workers w ON ta.worker_id = w.worker_id
INNER JOIN workers w ON ta.user_id = w.user_id
LEFT JOIN sso_users creator ON s.created_by = creator.user_id
LEFT JOIN workers lw ON s.leader_id = lw.worker_id
LEFT JOIN workers lw ON s.leader_user_id = lw.user_id
LEFT JOIN projects p ON ta.project_id = p.project_id
LEFT JOIN work_types wt ON ta.work_type_id = wt.id
LEFT JOIN tasks t ON ta.task_id = t.task_id