HealthSync_Intelligence/app/repositories/queries/similar_mission_queries.py
hyerimmy 910bd902b1
Some checks failed
HealthSync Intelligence CI / build-and-push (push) Has been cancelled
feat : initial commit
2025-06-20 05:28:30 +00:00

156 lines
5.2 KiB
Python

# app/repositories/queries/similar_mission_queries.py
"""
HealthSync AI 유사 사용자 미션 관련 쿼리 모음 (건강 데이터 포함)
"""
class SimilarMissionQueries:
"""유사 사용자 미션 관련 쿼리 (건강 데이터 강화)"""
# 최근 24시간 내 미션 완료 이력 조회 (건강 데이터 포함)
GET_RECENT_MISSION_COMPLETIONS = """
SELECT
mch.member_serial_number,
u.name,
u.occupation,
u.birth_date,
EXTRACT(YEAR FROM AGE(u.birth_date)) as age,
umg.mission_name,
umg.mission_description,
mch.daily_completed_count,
mch.completion_date,
mch.created_at,
-- 건강 데이터 추가
hc.height,
hc.weight,
hc.bmi,
hc.waist_circumference,
hc.systolic_bp,
hc.diastolic_bp,
hc.fasting_glucose,
hc.total_cholesterol,
hc.hdl_cholesterol,
hc.ldl_cholesterol,
hc.triglyceride,
hc.ast,
hc.alt,
hc.gamma_gtp,
hc.serum_creatinine,
hc.hemoglobin,
hc.smoking_status,
hc.drinking_status
FROM goal_service.mission_completion_history mch
INNER JOIN user_service.user u ON mch.member_serial_number = u.member_serial_number
INNER JOIN goal_service.user_mission_goal umg ON mch.mission_id = umg.mission_id
LEFT JOIN health_service.health_checkup hc ON u.member_serial_number = hc.member_serial_number
WHERE mch.member_serial_number = ANY(:user_ids)
AND mch.completion_date >= CURRENT_DATE - INTERVAL '1 day'
AND mch.daily_completed_count >= mch.daily_target_count
AND (hc.reference_year IS NULL OR hc.reference_year = (
SELECT MAX(reference_year)
FROM health_service.health_checkup
WHERE member_serial_number = u.member_serial_number
))
ORDER BY mch.created_at DESC
LIMIT 20
"""
# 사용자 건강 정보 조회 (벡터 생성용)
GET_USER_HEALTH_FOR_VECTOR = """
SELECT
u.member_serial_number,
u.name,
u.occupation,
EXTRACT(YEAR FROM AGE(u.birth_date)) as age,
u.updated_at,
hc.height,
hc.weight,
hc.bmi,
hc.waist_circumference,
hc.systolic_bp,
hc.diastolic_bp,
hc.fasting_glucose,
hc.total_cholesterol,
hc.hdl_cholesterol,
hc.ldl_cholesterol,
hc.triglyceride,
hc.ast,
hc.alt,
hc.gamma_gtp,
hc.serum_creatinine,
hc.hemoglobin,
hc.smoking_status,
hc.drinking_status
FROM user_service.user u
LEFT JOIN health_service.health_checkup hc ON u.member_serial_number = hc.member_serial_number
WHERE u.member_serial_number = :user_id
AND (hc.reference_year IS NULL OR hc.reference_year = (
SELECT MAX(reference_year)
FROM health_service.health_checkup
WHERE member_serial_number = u.member_serial_number
))
"""
# 직업 코드별 이름 조회
GET_OCCUPATION_NAME = """
SELECT
occupation_code,
occupation_name,
category
FROM user_service.occupation_type
WHERE occupation_code = :occupation_code
"""
# 사용자 기본 정보 조회 (여러 사용자)
GET_USERS_BASIC_INFO = """
SELECT
u.member_serial_number,
u.name,
u.occupation,
ot.occupation_name,
EXTRACT(YEAR FROM AGE(u.birth_date)) as age
FROM user_service.user u
LEFT JOIN user_service.occupation_type ot ON u.occupation = ot.occupation_code
WHERE u.member_serial_number = ANY(:user_ids)
"""
# 벡터 처리를 위한 모든 사용자 데이터 조회
GET_ALL_USERS_FOR_VECTOR = """
SELECT
u.member_serial_number,
u.name,
u.occupation,
EXTRACT(YEAR FROM AGE(u.birth_date)) as age,
u.updated_at,
hc.height,
hc.weight,
hc.bmi,
hc.waist_circumference,
hc.systolic_bp,
hc.diastolic_bp,
hc.fasting_glucose,
hc.total_cholesterol,
hc.hdl_cholesterol,
hc.ldl_cholesterol,
hc.triglyceride,
hc.ast,
hc.alt,
hc.gamma_gtp,
hc.serum_creatinine,
hc.hemoglobin,
hc.visual_acuity_left,
hc.visual_acuity_right,
hc.hearing_left,
hc.hearing_right,
hc.urine_protein,
hc.smoking_status,
hc.drinking_status
FROM user_service.user u
LEFT JOIN health_service.health_checkup hc ON u.member_serial_number = hc.member_serial_number
WHERE hc.reference_year IS NULL OR hc.reference_year = (
SELECT MAX(reference_year)
FROM health_service.health_checkup
WHERE member_serial_number = u.member_serial_number
)
ORDER BY u.member_serial_number
"""