Files
TK-FB-Project/synology_deployment/api/migrations/009_fix_duplicate_monthly_status.sql
Hyungi Ahn a2669e08c4 feat: v2.2.0 - 중복 카드 문제 해결 및 삭제 기능 개선
### 주요 변경사항

1. 작업 현황 모달 중복 카드 문제 근본 해결
   - monthlyStatusModel.getDailyWorkerStatus() 리팩토링
   - 집계 테이블 대신 daily_work_reports에서 직접 조회
   - GROUP BY로 작업자별 1개 카드 보장

2. 삭제 권한 강화
   - 작업보고서 삭제는 그룹장/시스템/관리자만 가능
   - 권한 없는 사용자는 403 에러 반환

3. 작업 입력 UI 개선
   - 작업 항목 삭제 버튼 스타일 개선 (이모지 + 빨간색)
   - 삭제 버튼 호버 효과 추가

4. 작업 현황 모달에 삭제 기능 추가
   - 관리자/그룹장만 삭제 버튼 표시
   - 작업자의 해당 날짜 전체 작업 삭제 가능

5. 시놀로지 배포 스크립트 추가
   - update.sh: DB 보존하면서 코드만 업데이트
   - 안전한 배포 절차 자동화
2025-12-02 13:33:24 +09:00

73 lines
2.0 KiB
SQL

-- 009_fix_duplicate_monthly_status.sql
-- monthly_worker_status 테이블의 중복 데이터 정리
-- 1. 중복 데이터 확인 (디버깅용)
-- SELECT worker_id, date, COUNT(*) as cnt
-- FROM monthly_worker_status
-- GROUP BY worker_id, date
-- HAVING cnt > 1;
-- 2. 중복 데이터 정리: 같은 worker_id, date에 대해 최신 데이터만 남기고 나머지 삭제
DELETE mws1 FROM monthly_worker_status mws1
INNER JOIN (
SELECT
worker_id,
date,
MAX(id) as keep_id
FROM monthly_worker_status
GROUP BY worker_id, date
) mws2 ON mws1.worker_id = mws2.worker_id
AND mws1.date = mws2.date
AND mws1.id < mws2.keep_id;
-- 3. 중복 제거 후 데이터 재집계 (선택사항)
-- 만약 합산이 필요하다면 다음 프로시저를 실행
DELIMITER $$
CREATE OR REPLACE PROCEDURE ConsolidateDuplicateMonthlyStatus()
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE v_worker_id INT;
DECLARE v_date DATE;
-- 중복이 있는 worker_id, date 조합 찾기
DECLARE cur CURSOR FOR
SELECT worker_id, date
FROM monthly_worker_status
GROUP BY worker_id, date
HAVING COUNT(*) > 1;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN cur;
read_loop: LOOP
FETCH cur INTO v_worker_id, v_date;
IF done THEN
LEAVE read_loop;
END IF;
-- 해당 작업자의 해당 날짜 데이터를 재계산하여 업데이트
CALL UpdateMonthlyWorkerStatus(v_date, v_worker_id);
END LOOP;
CLOSE cur;
END$$
DELIMITER ;
-- 4. 프로시저 실행하여 중복 데이터 통합
-- CALL ConsolidateDuplicateMonthlyStatus();
-- 5. 확인: 중복이 남아있는지 체크
SELECT
'중복 체크 완료' as message,
COUNT(*) as remaining_duplicates
FROM (
SELECT worker_id, date, COUNT(*) as cnt
FROM monthly_worker_status
GROUP BY worker_id, date
HAVING cnt > 1
) duplicates;