From 8f272ce1238a6359960689e5f295231cdf9b5497 Mon Sep 17 00:00:00 2001 From: yoon Date: Fri, 4 Apr 2025 19:22:27 +0900 Subject: [PATCH] selectbox --- src/main/resources/mapper/PromemberMapper.xml | 119 ++++++++++++++---- 1 file changed, 96 insertions(+), 23 deletions(-) diff --git a/src/main/resources/mapper/PromemberMapper.xml b/src/main/resources/mapper/PromemberMapper.xml index edf3a31..2cfd41c 100644 --- a/src/main/resources/mapper/PromemberMapper.xml +++ b/src/main/resources/mapper/PromemberMapper.xml @@ -51,7 +51,12 @@ INSERT INTO promember (PROJCTSEQ, MEMBERSEQ, PROJCTYON) - SELECT PROJCTSEQ, #{memberSeq}, '0' FROM netprojct; + SELECT PROJCTSEQ, #{memberSeq}, + CASE + WHEN PROJCTSEQ IN (1, 2) THEN '1' + ELSE '0' + END AS PROJCTYON + FROM netprojct; @@ -77,28 +82,96 @@ + SELECT + p.PROJCTSEQ, + p.PROJCTNAM, + c.CMNCODNAM AS projctcolor, + CASE + WHEN EXISTS ( -- 오늘 퇴근 기록이 있는지 확인 (퇴근 프로젝트 기준) + SELECT 1 + FROM commuters ct + WHERE ct.MEMBERSEQ = 4 + AND ct.COMMUTDAY = CURDATE() + AND ct.COMMUTLVE IS NOT NULL + AND ct.PROJCTLVE = p.PROJCTSEQ -- 퇴근 프로젝트 번호로 확인 + ) THEN 1 -- 오늘 퇴근: 오늘 해당 프로젝트로 퇴근했으면 최우선 + WHEN EXISTS ( -- 오늘 출근 기록이 있고 퇴근 안 했는지 확인 (출근 프로젝트 기준) + SELECT 1 + FROM commuters ct + WHERE ct.MEMBERSEQ = 4 + AND ct.COMMUTDAY = CURDATE() + AND ct.COMMUTCMT IS NOT NULL + AND ct.COMMUTLVE IS NULL + AND ct.PROJCTSEQ = p.PROJCTSEQ + ) THEN 2 -- 오늘 출근 (미퇴근): 출근했고 퇴근 안 했으면 두 번째 우선순위 + WHEN ( -- 전날 퇴근 기록이 있는 프로젝트인지 확인 (퇴근 프로젝트 기준) + SELECT cl.PROJCTLVE -- 전날 퇴근한 프로젝트 ID + FROM commuters cl + WHERE cl.MEMBERSEQ = 4 + AND cl.COMMUTDAY = CURDATE() - INTERVAL '1' DAY + AND cl.COMMUTLVE IS NOT NULL + AND cl.PROJCTLVE = p.PROJCTSEQ -- 퇴근 프로젝트 번호로 확인 + ORDER BY cl.COMMUTLVE DESC + LIMIT 1 + ) IS NOT NULL THEN 3 -- 전날 퇴근: 전날 퇴근한 프로젝트 (세 번째 우선순위) + WHEN ( -- 전날 퇴근 기록은 없고 출근 기록만 있는 프로젝트인지 확인 (출근 프로젝트 기준) + SELECT cc.PROJCTSEQ -- 전날 출근한 프로젝트 ID + FROM commuters cc + WHERE cc.MEMBERSEQ = 4 + AND cc.COMMUTDAY = CURDATE() - INTERVAL '1' DAY + AND cc.COMMUTLVE IS NULL + AND cc.PROJCTSEQ = p.PROJCTSEQ + LIMIT 1 + ) IS NOT NULL THEN 4 -- 전날 출근 (미퇴근): 전날 출근만 하고 퇴근 안 한 프로젝트 (네 번째 우선순위) + ELSE 5 -- 그 외의 경우 (가장 낮은 우선순위) + END AS sort_group, -- 정렬 그룹 (숫자가 작을수록 우선순위 높음) + MAX(CASE -- 현재 체크인된 프로젝트 ID + WHEN cm_today.COMMUTCMT IS NOT NULL + AND cm_today.COMMUTLVE IS NULL + THEN cm_today.PROJCTSEQ + ELSE NULL + END) AS current_check_in_project, + MAX(cm.PROJCTLVE) AS last_worked_project, -- 마지막으로 작업했던 프로젝트 ID (퇴근 기준) + MAX(cm.COMMUTLVE) AS last_check_out_time, -- 마지막 퇴근 시간 + MAX(cm.COMMUTCMT) AS last_check_in_time, -- 마지막 출근 시간 + ( + SELECT cl.PROJCTLVE + FROM commuters cl + WHERE cl.MEMBERSEQ = 4 + AND cl.COMMUTDAY = CURDATE() - INTERVAL '1' DAY + AND cl.COMMUTLVE IS NOT NULL + ORDER BY cl.COMMUTLVE DESC + LIMIT 1 + ) AS default_project_yesterday_leave, -- 전날 마지막 퇴근한 프로젝트 ID + ( + SELECT cc.PROJCTSEQ + FROM commuters cc + WHERE cc.MEMBERSEQ = 4 + AND cc.COMMUTDAY = CURDATE() - INTERVAL '1' DAY + AND cc.COMMUTLVE IS NULL + LIMIT 1 + ) AS default_project_yesterday_checkin -- 전날 마지막 출근한 프로젝트 ID (퇴근 기록 없는 경우) + FROM promember pm -- 회원-프로젝트 매핑 테이블 + JOIN netprojct p ON pm.PROJCTSEQ = p.PROJCTSEQ -- 프로젝트 테이블과 조인 + LEFT JOIN commoncod c ON p.PROJCTCOL = c.CMNCODVAL AND c.CMNCODYNP = '1' -- 공통 코드 테이블 (프로젝트 색상)과 외부 조인 + LEFT JOIN commuters cm + ON pm.MEMBERSEQ = cm.MEMBERSEQ + AND (pm.PROJCTSEQ = cm.PROJCTSEQ OR pm.PROJCTSEQ = cm.PROJCTLVE) -- 출퇴근 기록 테이블과 외부 조인 (현재 또는 마지막 작업 프로젝트) + LEFT JOIN commuters cm_today + ON pm.MEMBERSEQ = cm_today.MEMBERSEQ + AND pm.PROJCTSEQ = cm_today.PROJCTSEQ + AND cm_today.COMMUTDAY = CURDATE() -- 오늘 출퇴근 기록 테이블과 외부 조인 (현재 프로젝트 기준) + WHERE pm.MEMBERSEQ = 4 -- 특정 회원 ID 조건 + AND pm.PROJCTYON = '1' -- 프로젝트 사용 여부 조건 + AND (p.PROJCTEND IS NULL OR p.PROJCTEND >= CURDATE()) -- 프로젝트 종료일 조건 (종료되지 않았거나 종료일이 오늘 이후) + GROUP BY p.PROJCTSEQ, p.PROJCTNAM, c.CMNCODNAM -- 프로젝트별로 그룹화 + ORDER BY + sort_group ASC, + MAX(cm.COMMUTLVE) DESC, + MAX(cm.COMMUTCMT) DESC, + p.PROJCTSTR DESC; + + DELETE FROM promember WHERE PROJCTSEQ = #{projctSeq}