fix: 캘린더 모달 중복 카드 문제 및 삭제 권한 개선
- monthly_worker_status 조회 시 GROUP BY로 중복 데이터 합산 - 작업보고서 삭제 권한을 그룹장 이상으로 제한 (admin, system, group_leader) - 중복 데이터 정리를 위한 마이그레이션 SQL 추가 (009_fix_duplicate_monthly_status.sql) - synology_deployment 버전에도 동일 수정 적용
This commit is contained in:
@@ -0,0 +1,72 @@
|
||||
-- 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;
|
||||
|
||||
Reference in New Issue
Block a user