fix: 캘린더 모달 중복 카드 문제 및 삭제 권한 개선
- monthly_worker_status 조회 시 GROUP BY로 중복 데이터 합산 - 작업보고서 삭제 권한을 그룹장 이상으로 제한 (admin, system, group_leader) - 중복 데이터 정리를 위한 마이그레이션 SQL 추가 (009_fix_duplicate_monthly_status.sql) - synology_deployment 버전에도 동일 수정 적용
This commit is contained in:
@@ -203,7 +203,7 @@ class WorkAnalysis {
|
||||
dwr.created_at
|
||||
FROM daily_work_reports dwr
|
||||
LEFT JOIN workers w ON dwr.worker_id = w.worker_id
|
||||
LEFT JOIN Projects p ON dwr.project_id = p.project_id
|
||||
LEFT JOIN projects p ON dwr.project_id = p.project_id
|
||||
LEFT JOIN work_types wt ON dwr.work_type_id = wt.id
|
||||
LEFT JOIN work_status_types wst ON dwr.work_status_id = wst.id
|
||||
LEFT JOIN error_types et ON dwr.error_type_id = et.id
|
||||
|
||||
@@ -37,7 +37,7 @@ const getAnalysis = async (startDate, endDate) => {
|
||||
const byProjectSql = `
|
||||
SELECT p.project_name as name, SUM(${workHoursCalc}) as hours, COUNT(DISTINCT dwr.worker_id) as participants
|
||||
FROM DailyWorkReports dwr
|
||||
JOIN Projects p ON dwr.project_id = p.project_id
|
||||
JOIN projects p ON dwr.project_id = p.project_id
|
||||
${whereClause}
|
||||
GROUP BY p.project_name
|
||||
HAVING hours > 0
|
||||
@@ -73,7 +73,7 @@ const getAnalysis = async (startDate, endDate) => {
|
||||
t.category as task_category, dwr.work_details,
|
||||
(${workHoursCalc}) as work_hours, dwr.memo
|
||||
FROM DailyWorkReports dwr
|
||||
JOIN Projects p ON dwr.project_id = p.project_id
|
||||
JOIN projects p ON dwr.project_id = p.project_id
|
||||
JOIN workers w ON dwr.worker_id = w.worker_id
|
||||
JOIN Tasks t ON dwr.task_id = t.task_id
|
||||
${whereClause}
|
||||
|
||||
@@ -47,7 +47,7 @@ const getAllByDate = async (date) => {
|
||||
t.category, t.subcategory, d.description
|
||||
FROM DailyIssueReports d
|
||||
LEFT JOIN workers w ON d.worker_id = w.worker_id
|
||||
LEFT JOIN Projects p ON d.project_id = p.project_id
|
||||
LEFT JOIN projects p ON d.project_id = p.project_id
|
||||
LEFT JOIN IssueTypes t ON d.issue_type_id = t.issue_type_id
|
||||
WHERE d.date = ?
|
||||
ORDER BY d.start_time ASC`,
|
||||
|
||||
@@ -45,14 +45,30 @@ class MonthlyStatusModel {
|
||||
const db = await getDb();
|
||||
|
||||
try {
|
||||
// 중복 방지: worker_id와 date로 그룹화하고 최신 데이터만 조회
|
||||
const [rows] = await db.execute(`
|
||||
SELECT
|
||||
mws.*,
|
||||
mws.worker_id,
|
||||
w.worker_name,
|
||||
w.job_type
|
||||
w.job_type,
|
||||
MAX(mws.year) as year,
|
||||
MAX(mws.month) as month,
|
||||
mws.date,
|
||||
SUM(mws.total_work_hours) as total_work_hours,
|
||||
SUM(mws.actual_work_hours) as actual_work_hours,
|
||||
SUM(mws.vacation_hours) as vacation_hours,
|
||||
SUM(mws.total_work_count) as total_work_count,
|
||||
SUM(mws.regular_work_count) as regular_work_count,
|
||||
SUM(mws.error_work_count) as error_work_count,
|
||||
MAX(mws.work_status) as work_status,
|
||||
MAX(mws.has_vacation) as has_vacation,
|
||||
MAX(mws.has_error) as has_error,
|
||||
MAX(mws.has_issues) as has_issues,
|
||||
MAX(mws.last_updated) as last_updated
|
||||
FROM monthly_worker_status mws
|
||||
JOIN workers w ON mws.worker_id = w.worker_id
|
||||
WHERE mws.date = ?
|
||||
GROUP BY mws.worker_id, mws.date, w.worker_name, w.job_type
|
||||
ORDER BY w.worker_name ASC
|
||||
`, [date]);
|
||||
|
||||
|
||||
@@ -91,7 +91,7 @@ const create = async (report, callback) => {
|
||||
wr.memo
|
||||
FROM WorkReports wr
|
||||
LEFT JOIN workers w ON wr.worker_id = w.worker_id
|
||||
LEFT JOIN Projects p ON wr.project_id = p.project_id
|
||||
LEFT JOIN projects p ON wr.project_id = p.project_id
|
||||
LEFT JOIN Tasks t ON wr.task_id = t.task_id
|
||||
WHERE wr.\`date\` = ?
|
||||
ORDER BY w.worker_name ASC
|
||||
|
||||
Reference in New Issue
Block a user