209 lines
5.8 KiB
PL/PgSQL
209 lines
5.8 KiB
PL/PgSQL
-- 鍏昏€佺<E282AC>鐞嗙郴缁熻€佷汉绔<E6B189>浉鍏砇PC鍑芥暟
|
||
-- 閫傜敤浜<E695A4> supabase/postgresql
|
||
|
||
-- 1. 鑾峰彇鑰佷汉鍩烘湰淇℃伅
|
||
drop function if exists get_elder_info(uuid);
|
||
create or replace function get_elder_info(elder_id uuid)
|
||
returns table (
|
||
id uuid,
|
||
name text,
|
||
gender text,
|
||
birthday date,
|
||
room_number text,
|
||
status text
|
||
) as $$
|
||
begin
|
||
return query
|
||
select
|
||
e.id,
|
||
e.name,
|
||
e.gender,
|
||
e.birthday,
|
||
e.room_number,
|
||
e.status
|
||
from public.ec_elders e
|
||
where e.id = elder_id or e.user_id = elder_id
|
||
limit 1;
|
||
end;
|
||
$$ language plpgsql stable;
|
||
|
||
-- 2. 鑾峰彇鐢熷懡浣撳緛鍘嗗彶
|
||
drop function if exists get_vital_history(uuid, int);
|
||
create or replace function get_vital_history(elder_id uuid, limit_count int default 20)
|
||
returns setof public.ec_vital_signs as $$
|
||
begin
|
||
return query
|
||
select *
|
||
from public.ec_vital_signs
|
||
where elder_id = get_vital_history.elder_id
|
||
order by measured_at desc
|
||
limit limit_count;
|
||
end;
|
||
$$ language plpgsql stable;
|
||
|
||
-- 3. 鑾峰彇鍋ュ悍妗f<E5A697>
|
||
drop function if exists get_health_records(uuid);
|
||
create or replace function get_health_records(elder_id uuid)
|
||
returns setof public.ec_health_records as $$
|
||
begin
|
||
return query
|
||
select *
|
||
from public.ec_health_records
|
||
where elder_id = get_health_records.elder_id
|
||
order by record_date desc;
|
||
end;
|
||
$$ language plpgsql stable;
|
||
|
||
-- 4. 鑾峰彇鍋ュ悍棰勮<E6A3B0>
|
||
drop function if exists get_health_alerts(uuid);
|
||
create or replace function get_health_alerts(elder_id uuid)
|
||
returns setof public.ec_health_alerts as $$
|
||
begin
|
||
return query
|
||
select *
|
||
from public.ec_health_alerts
|
||
where elder_id = get_health_alerts.elder_id
|
||
order by created_at desc;
|
||
end;
|
||
$$ language plpgsql stable;
|
||
|
||
-- 5. 鑾峰彇鏈€杩戠敓鍛戒綋寰侊紙浠<E7B499>〃鏉垮崱鐗囷級
|
||
drop function if exists get_recent_vitals(uuid, int);
|
||
create or replace function get_recent_vitals(elder_id uuid, limit_count int default 3)
|
||
returns setof public.ec_vital_signs as $$
|
||
begin
|
||
return query
|
||
select *
|
||
from public.ec_vital_signs
|
||
where elder_id = get_recent_vitals.elder_id
|
||
order by measured_at desc
|
||
limit limit_count;
|
||
end;
|
||
$$ language plpgsql stable;
|
||
|
||
-- 6. 鑾峰彇浠婃棩娲诲姩
|
||
drop function if exists get_elder_activities(uuid, date);
|
||
create or replace function get_elder_activities(elder_id uuid, date date)
|
||
returns setof public.ec_activities as $$
|
||
begin
|
||
return query
|
||
select a.*
|
||
from public.ec_activities a
|
||
join public.ec_activity_participations p on a.id = p.activity_id
|
||
where p.elder_id = get_elder_activities.elder_id
|
||
and date(a.start_time) = get_elder_activities.date
|
||
order by a.start_time asc;
|
||
end;
|
||
$$ language plpgsql stable;
|
||
|
||
-- 7. 鑾峰彇浠婃棩鐢ㄨ嵂
|
||
drop function if exists get_elder_medications(uuid, date);
|
||
create or replace function get_elder_medications(elder_id uuid, date date)
|
||
returns setof public.ec_medications as $$
|
||
begin
|
||
return query
|
||
select m.*
|
||
from public.ec_medications m
|
||
where m.elder_id = get_elder_medications.elder_id
|
||
and (m.start_date is null or m.start_date <= get_elder_medications.date)
|
||
and (m.end_date is null or m.end_date >= get_elder_medications.date)
|
||
order by m.medication_name asc;
|
||
end;
|
||
$$ language plpgsql stable;
|
||
|
||
-- 8. 鑾峰彇鍒嗛厤鎶ょ悊鍛<E6828A>
|
||
drop function if exists get_assigned_caregiver(uuid);
|
||
create or replace function get_assigned_caregiver(elder_id uuid)
|
||
returns table (
|
||
id uuid,
|
||
employee_id text,
|
||
name text,
|
||
phone text,
|
||
department text,
|
||
specialization text,
|
||
shift text
|
||
) as $$
|
||
begin
|
||
return query
|
||
select c.id, c.employee_id, c.name, c.phone, c.department, c.specialization, c.work_shift as shift
|
||
from public.ec_caregivers c
|
||
join public.ec_elders e on c.id = e.caregiver_id
|
||
where e.id = get_assigned_caregiver.elder_id
|
||
limit 1;
|
||
end;
|
||
$$ language plpgsql stable;
|
||
|
||
-- 9. 鑾峰彇寰呭<E5AFB0>鐞嗘湇鍔¤<E98D94>姹傛暟
|
||
drop function if exists get_pending_requests_count(uuid);
|
||
create or replace function get_pending_requests_count(elder_id uuid)
|
||
returns table (count int) as $$
|
||
begin
|
||
return query
|
||
select count(*)
|
||
from public.ec_service_requests
|
||
where elder_id = get_pending_requests_count.elder_id
|
||
and status = 'pending';
|
||
end;
|
||
$$ language plpgsql stable;
|
||
|
||
-- 10. 鏍囪<E98F8D>鐢ㄨ嵂宸叉湇鐢<E6B987>
|
||
drop function if exists update_medication_status(uuid, text, timestamptz);
|
||
create or replace function update_medication_status(medication_id uuid, status text, taken_time timestamptz)
|
||
returns void as $$
|
||
begin
|
||
update public.ec_medications
|
||
set status = update_medication_status.status,
|
||
updated_at = now()
|
||
where id = update_medication_status.medication_id;
|
||
end;
|
||
$$ language plpgsql volatile;
|
||
|
||
-- 11. 鍒涘缓绱ф€ュ懠鍙<E687A0>
|
||
drop function if exists create_emergency_call(uuid, text, text);
|
||
create or replace function create_emergency_call(elder_id uuid, type text, description text)
|
||
returns void as $$
|
||
begin
|
||
insert into public.ec_emergency_calls (elder_id, type, description, created_at)
|
||
values (elder_id, type, description, now());
|
||
end;
|
||
$$ language plpgsql volatile;
|
||
|
||
-- 12. 鍒涘缓鏈嶅姟璇锋眰
|
||
drop function if exists create_service_request(uuid, text, text, text);
|
||
create or replace function create_service_request(elder_id uuid, type text, priority text, description text)
|
||
returns void as $$
|
||
begin
|
||
insert into public.ec_service_requests (elder_id, type, priority, description, status, created_at)
|
||
values (elder_id, type, priority, description, 'pending', now());
|
||
end;
|
||
$$ language plpgsql volatile;
|
||
|
||
-- 13. 护理员查询所有老人信息
|
||
drop function if exists caregiver_get_all_elders();
|
||
create or replace function caregiver_get_all_elders()
|
||
returns table (
|
||
id uuid,
|
||
name text,
|
||
gender text,
|
||
birthday date,
|
||
room_number text,
|
||
bed_number text,
|
||
care_level text,
|
||
status text
|
||
) as 100
|
||
begin
|
||
return query
|
||
select
|
||
e.id,
|
||
e.name,
|
||
e.gender::text,
|
||
e.birthday,
|
||
e.room_number::text,
|
||
e.bed_number::text,
|
||
e.care_level::text,
|
||
e.status::text
|
||
from public.ec_elders e
|
||
order by e.room_number, e.bed_number;
|
||
end;
|
||
100 language plpgsql stable;
|